警惕Mybatis的Foreach的的副作用

对于如下SQL:
假设有如下的mapper:
<select id=”testForeach”  parameterType=”map”  resultType=”Student”>
    Select * from student
    <where> 
    <choose>
        <when test=”ID != null and ID != ‘’ ”>
            ID = #{ID}
        </when>
        <when test=” IDArr != null and IDArr.size()>0”>
            And ID IN
            <foreach collection="IDArr" open="("
                separator="," close=")" item="ID">
                ${ID}
            </foreach>
        </when>
</choose>
</where>

当我们传入的IDArr时,最后产生的SQL为:
Select * from student where ID = ‘998’ AND ID IN ( ‘123’, ’234’,…..,’998’)
解决办法:
解决办法有
1) 将红色的ID 换成别的名称,比如“item”。
2) 这两个if 是对同一个字段判断,改为choose… when 结构
<select id=”testForeach”  parameterType=”map”  resultType=”Student”>
    Select * from student
    <where> 
    <choose>
        <when test=”ID != null and ID != ‘’ ”>
            ID = #{ID}
        </when>
        <when test=” IDArr != null and IDArr.size()>0”>
            And ID IN
            <foreach collection="IDArr" open="("
                separator="," close=")" item="ID">
                ${ID}
            </foreach>
        </when>
</choose>
</where>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值