目录
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接口
/**
* @param bmsBillMemoList
* @return
*/
public int insertBatchMemo(List<BmsBillMemo> bmsBillMemoList);
映射文件
<insert id="insertBatchMemo">
insert into bms_bills_memo(
supplier_id,
supplier_name,
client_id,
client_name,
client_short_name,
currency,
exchange_rate,
consignment_id,
bill_of_lading_no,
expense_id,
expense_name,
unit_price_contain_tax,
unit_price,
amounts,
tax_rate,
tax,
total_contain_rate,
total,
contains_count,
is_locked,
belonging_to_date,
memo_type,
charge_desc,
payment_type,
create_by,
create_time)
values
<foreach collection="list" item="detail" separator=",">
( #{detail.supplierId},#{detail.supplierName}, #{detail.clientId},
#{detail.clientName},#{detail.clientShortName},#{detail.currency},
#{detail.exchangeRate},#{detail.consignmentId},#{detail.billOfLadingNo},
#{detail.expenseId},#{detail.expenseName},#{detail.unitPriceContainTax},
#{detail.unitPrice},#{detail.amounts},#{detail.taxRate},
#{detail.tax},#{detail.totalContainRate},#{detail.total},
#{detail.containsCount},#{detail.isLocked},#{detail.belongingToDate},
#{detail.memoType},#{detail.chargeDesc},#{detail.paymentType},
#{detail.createBy},#{detail.createTime}
)
</foreach>
</insert>
入参只有一个且是list类型,collection设置为list。
(2).传入的是单参数且参数类型是一个array数组
mapper接口
/**
* 批量删除结算账单手账
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteBmsBillMemoByIds(Long[] ids);
映射文件
<delete id="deleteBmsBillMemoByIds" >
delete from bms_bills_memo where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
入参只有一个且是数组的场合,collection设置为array。
(3).传入的参数是实体类,并且实体中包含数组和集合
入参的实体类
package com.example.demo.domain;
import lombok.Data;
import java.util.List;
/**
* @author linaibo
* @version 1.0
* Create by 2022/12/20 15:07
*/
@Data
public class selectVo {
private Long id;
private Long supplierId;
private Long[] ids;
private List<Long> clientIdList;
}
mapper接口
public List<BmsBillMemo> listMemo(selectVo select);
映射文件
<select id="listMemo" resultType="com.example.demo.domain.BmsBillMemo">
select *
from bms_bills_memo
<where>
and id in
<foreach collection="ids" open="(" close=")" item="detail" separator=",">
#{detail}
</foreach>
and
client_id in
<foreach collection="clientIdList" separator="," item="detail" open="(" close=")" >
#{detail}
</foreach>
</where>
</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);
?映射文件
<select id="listMemo1" resultType="com.example.demo.domain.BmsBillMemo">
select *
from bms_bills_memo
<where>
and id in
<foreach collection="idArray" open="(" close=")" item="detail" separator=",">
#{detail}
</foreach>
and
client_id in
<foreach collection="clientIdList" separator="," item="detail" open="(" close=")" >
#{detail}
</foreach>
</where>
</select>
collection需要使用到Param中定义的别名。
4.总结
以上几种比较常见,如果在mapper接口中添加@Param注解的场合,list,array将会失效,collection的内容需要使用Param中的别名来指定你需要用到的list或者array,这个需要注意,一般在只有一个参数的场合,没有必要使用Param注解。
|