20、动态SQL之<foreach>标签

有时传入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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值