foreach
动态SQL的另一个常用的操作需求是对一个集合进行便利,通常是在构建IN条件语句的时候。比如:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项 (item) 和索引 (index) 变量。它也允许你制定开头与结尾的字符串以及在迭代结果之间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符
你可以讲任何可迭代对象(如List、Set等)、Map对象或者数组对象传递给foreach作为集合参数。当使用可迭代休想或者数组是,index 是当前迭代的次数,item的值是本次迭代获取的元素。当使用Map对象(或者Map.Entry对象的集合)时,index是键,item是值。
foreach属性
item | collection | separator | open | close | index |
---|---|---|---|---|---|
循环体中的具体对象。支持属性的点路径,如item.age,item.info.details。具体说明:若collection属性为list或array,则item代表list或array里面的一个元素。若collection属性对应一个map,则item代表的是map中的value集合中的单个value 该参数为必选 | foreach遍历的对象,作为入参时,List对象默认用list代替作为键,数组对象有aray代替作为键,Map对象没有默认的键。也就是传入的集合(list,array,map)的名字,这个名字可以在foreach里面随便引用) 当然在座位入参时可以使用@Param(“params”)来设置键,设置keyName后,list,array将会失效。除了入参这种情况外,还有一种作为参数对象的某个字段的时候。 如果传入参数类型为map,这个入参有注解@Param(“params”),则map的所有的key集合可以写成params.keys,所有值集合可以写成params.values。这样foreach就可以对key集合或值集合进行迭代了。 该参数为必选。 | 元素之间的分隔符,例如在in()的时候,separator=",”隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选 | foreach代码的开始符号,一般是( 和close=")" 合用。 常用在in(),values()时。该参数可选。 | foreach代码的关闭符号,一般是) 和open="(" 合用。 常用在in(),values()时。该参数可选 | 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。 |