foreach一般在使用在SQL语句的IN条件中,目的是确认某个字段是否在目的范围内。在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Mybatis中提供了foreach功能,该功能比较强大,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。
格式为
WHERE A_DB.a IN
<foreach collection="集合类型" index="" item="集合别名" open="开始符" separator="分隔符" close="结束符">
#{别名}
</foreach>
参数为:
collection:指定集合类型,参数为list,array,map的key名,也可以填写函数的参数名,mybatis会自动转化为对应类型
index:当前迭代次数,当循环到第i个元素时,此时index=i
item:循环体中的对象,可以进行路径访问,例如item.a,item.a.b,如果是array类型直接访问元素,如果是map类型指代value
open:开始字符,一般为(
separator:分隔符,一般为,
close:结束字符,一般为)
注意:可以将任何可迭代对象(如列表、集合等)和任何的字典或者数组对象传递给foreach作为集合参数。当使用可迭代对象或者数组时,index是当前迭代的次数,item的值是本次迭代获取的元素。当使用字典(或者Map.Entry对象的集合)时,index是键,item是值。
1.当参数为array,list,map时,常规用法,按照上述格式使用,
2.当有多个参数时,讲多个参数打包为map方式,collection处的ids为map的key名称,item为value
findByIds(String name,int[] ids);
Map<String, Object> params = new HashMap<String, Object>(2);
params.put("name", name);
params.put("ids", ids);
mapper.findByIdsMap(params);
<select id="dynamicForeach3Test" resultType="Blog">
select * from table where id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
3.当参数为一个对象时,直接讲collection置为元素名
class student{
int[] ids;
String class;
}
<foreach item="id" collection="ids">
</foreach >
在网上看到一个index用法解释https://blog.csdn.net/liudongdong0909/article/details/53838246
index可解决业务需要设置sort字段的问题,sort用于保留原集合的排列顺序
<insert id="batchInsertSelective" parameterType="list">
insert into
proc_pre_item (proc_tempt_id, type_id, sort, create_user, create_date)
values
<foreach collection="list" separator="," item="preItem" index="idx">
(
#{preItem.procTemptId,jdbcType=BIGINT},
#{preItem.typeId,jdbcType=BIGINT},
#{idx},
#{preItem.createUser,jdbcType=BIGINT},
#{preItem.createDate,jdbcType=TIMESTAMP}
)
</foreach>
</insert>