当前位置:   article > 正文

MyBatis中foreach使用_mybatis foreach用法

mybatis foreach用法

目录

1.foreach中的属性说明

2.collection属性的详细说明

3.示例

(1).传入的是单参数且参数类型是一个List

(2).传入的是单参数且参数类型是一个array数组

(3).传入的参数是实体类,并且实体中包含数组和集合

(4).传入多个list或者array,不使用实体进行封装。

4.总结


1.foreach中的属性说明

  • item:集合中元素迭代时的别名,该参数为必选,通过别名进行取值。
  • index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
  • open:foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选
  • separator:元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
  • close: foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。
  • collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,实体类作为参数对象的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection = "ids".如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id"

2.collection属性的详细说明

  • 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
  • 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
  • 如果传入的参数是一个实体的场合,假如实体中有list也有array,当需要使用list的场合,collection的属性值为list的id,当需要使用array的场合,collection的属性值为array的id,详细的可以参照下面的例子

3.示例

(1).传入的是单参数且参数类型是一个List

mapper接口

  1. /**
  2. * @param bmsBillMemoList
  3. * @return
  4. */
  5. public int insertBatchMemo(List<BmsBillMemo> bmsBillMemoList);

映射文件

  1. <insert id="insertBatchMemo">
  2. insert into bms_bills_memo(
  3. supplier_id,
  4. supplier_name,
  5. client_id,
  6. client_name,
  7. client_short_name,
  8. currency,
  9. exchange_rate,
  10. consignment_id,
  11. bill_of_lading_no,
  12. expense_id,
  13. expense_name,
  14. unit_price_contain_tax,
  15. unit_price,
  16. amounts,
  17. tax_rate,
  18. tax,
  19. total_contain_rate,
  20. total,
  21. contains_count,
  22. is_locked,
  23. belonging_to_date,
  24. memo_type,
  25. charge_desc,
  26. payment_type,
  27. create_by,
  28. create_time)
  29. values
  30. <foreach collection="list" item="detail" separator=",">
  31. ( #{detail.supplierId},#{detail.supplierName}, #{detail.clientId},
  32. #{detail.clientName},#{detail.clientShortName},#{detail.currency},
  33. #{detail.exchangeRate},#{detail.consignmentId},#{detail.billOfLadingNo},
  34. #{detail.expenseId},#{detail.expenseName},#{detail.unitPriceContainTax},
  35. #{detail.unitPrice},#{detail.amounts},#{detail.taxRate},
  36. #{detail.tax},#{detail.totalContainRate},#{detail.total},
  37. #{detail.containsCount},#{detail.isLocked},#{detail.belongingToDate},
  38. #{detail.memoType},#{detail.chargeDesc},#{detail.paymentType},
  39. #{detail.createBy},#{detail.createTime}
  40. )
  41. </foreach>
  42. </insert>

入参只有一个且是list类型,collection设置为list。

(2).传入的是单参数且参数类型是一个array数组

mapper接口

  1. /**
  2. * 批量删除结算账单手账
  3. *
  4. * @param ids 需要删除的数据主键集合
  5. * @return 结果
  6. */
  7. public int deleteBmsBillMemoByIds(Long[] ids);

映射文件

  1. <delete id="deleteBmsBillMemoByIds" >
  2. delete from bms_bills_memo where id in
  3. <foreach item="id" collection="array" open="(" separator="," close=")">
  4. #{id}
  5. </foreach>
  6. </delete>

入参只有一个且是数组的场合,collection设置为array。

(3).传入的参数是实体类,并且实体中包含数组和集合

入参的实体类

  1. package com.example.demo.domain;
  2. import lombok.Data;
  3. import java.util.List;
  4. /**
  5. * @author linaibo
  6. * @version 1.0
  7. * Create by 2022/12/20 15:07
  8. */
  9. @Data
  10. public class selectVo {
  11. private Long id;
  12. private Long supplierId;
  13. private Long[] ids;
  14. private List<Long> clientIdList;
  15. }

mapper接口

    public List<BmsBillMemo> listMemo(selectVo select);

映射文件

  1. <select id="listMemo" resultType="com.example.demo.domain.BmsBillMemo">
  2. select *
  3. from bms_bills_memo
  4. <where>
  5. and id in
  6. <foreach collection="ids" open="(" close=")" item="detail" separator=",">
  7. #{detail}
  8. </foreach>
  9. and
  10. client_id in
  11. <foreach collection="clientIdList" separator="," item="detail" open="(" close=")" >
  12. #{detail}
  13. </foreach>
  14. </where>
  15. </select>

传入的参数是实体类,并且实体中包含数组和集合,使用list的场合,collection的内容是是list的id,即clientIdList,使用array的场合,collection的内容是是array的id,即ids

(4).传入多个list或者array,不使用实体进行封装。

mapper接口

    public  List<BmsBillMemo> listMemo1(@Param("idArray") Long[] array, @Param("clientIdList") List<Long> list);

 映射文件

  1. <select id="listMemo1" resultType="com.example.demo.domain.BmsBillMemo">
  2. select *
  3. from bms_bills_memo
  4. <where>
  5. and id in
  6. <foreach collection="idArray" open="(" close=")" item="detail" separator=",">
  7. #{detail}
  8. </foreach>
  9. and
  10. client_id in
  11. <foreach collection="clientIdList" separator="," item="detail" open="(" close=")" >
  12. #{detail}
  13. </foreach>
  14. </where>
  15. </select>

collection需要使用到Param中定义的别名。

4.总结

以上几种比较常见,如果在mapper接口中添加@Param注解的场合,list,array将会失效,collection的内容需要使用Param中的别名来指定你需要用到的list或者array,这个需要注意,一般在只有一个参数的场合,没有必要使用Param注解。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/749105
推荐阅读
相关标签
  

闽ICP备14008679号