您的位置:首页 > 数据库

20、动态SQL之<foreach>标签

2018-01-23 00:06 302 查看
有时传入SQL语句中的参数为一个集合,在SQL语句中就需要遍历集合中的每一个参数,此时就需要用到了
<foreach>
标签。下面以具体情况演示

一、查询

查询PERSON表中id={1,2,3}的记录,SQL语句为:

select * from PERSON where id in (1,2,3)


下面在mybatis中实现该SQL语句,首先定义对应的DAO接口:

public interface PersonDao {
public List<Person> getPerson(@Param("ids")List<Integer> ids);
}


接口中传入的ids为一个List集合类型,里面传入[1,2,3]参数。

该sql语句对应的mapper实现为:

<mapper namespace="com.lzj.mybatis.dao.PersonDao">
<!--
collection:指定要遍历的集合:
list类型的参数会特殊处理封装在map中,map的key就叫list
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
index:索引。遍历list的时候是index就是索引,item就是当前值
遍历map的时候index表示的就是map的key,item就是map的值

#{变量名}就能取出变量的值也就是当前遍历出的元素

-->
<select id="getPerson" resultType="com.lzj.mybaits.bean.Person">
select * from PERSON
<foreach collection="ids" item="item_id" separator=","
open="where id in(" close=")">
#{item_id}
</foreach>
</select>
</mapper>


在上面用
<foreach>
实现遍历,把输入的List类型的参数ids放入collection属性中;item=”item_id”表示每次循环ids中的值放入item_id变量中;open=”where id in(“表示
<foreach>
标签包裹的字符串拼接后的结果要以”where id in(“开始,即在拼接的字符串前面加上”where id in(“字符串;close=”)”表示
<foreach>
标签包裹的字符串拼接后的结果要以”)”结束,即在拼接后的字符串后面加上”)”;separator=”,”表示从List类型的ids变量中遍历的每个参数值要以”,”隔开,并拼接起来。

假设传入的List类型的ids为[1,2,3],遍历集合中所有的值后,并用separator=”,”指定的”,”把3个参数隔开,即拼接的字符串为:“1,2,3”;open=”where id in(“指定拼接的字符串开始字符串,因此拼接后的字符串变为:”where id in(1,2,3”;close=”)”指定拼接后的字符串要以”)”结束,因此拼接后的字符串变为:”where id in(1,2,3)”。

因此当输入的参数为[1,2,3]时,SQL语句就变成了:

select * from PERSON where id in(1,2,3)


当然用 拼接成指定的字符串的方法很多,例如下面:

<select id="getPerson" resultType="com.lzj.mybaits.bean.Person">
select * from PERSON where id in(
<!--此时没有用open和close属性-->
<foreach collection="ids" item="item_id" separator=",">
#{item_id}
</foreach>
)
</select>
</mapper>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: