mybatis foreach list特殊处理

最近做一个功能,sql要用到 IN 条件,通过list传入IN 的值,如:

SELECT * FROM table1 WHERE id in (1,2,3)

对应的mybatis写法为:

<select id="queryByIds" resultMap="resultMap" parameterType="list">
        SELECT * FROM table1
        WHERE id
        <foreach collection="list" item="rid" open="in(" separator="," close=")">
            #{rid}
        </foreach>
    </select>

期望结果是按list的值进行查询。
可是,当list为空的时候呢?
sql应该是这样的SELECT * FROM table1 WHERE id in ()。直接在mysql中运行肯定是语法错误的。
无论如何是不会查到数据的,但mybatis又是什么策略呢?直接把这一条where条件给我忽略了....导致查全表数据。
这也不好说mybatis做的好不好,算不算bug了。
既然知道套路了,就得有策略来应对了。于是多写了两个if。

<select id="queryByIds" resultMap="resultMap" parameterType="list">
        SELECT * FROM table1
        WHERE id
        <if test="list != null and list.size() > 0">
            <foreach collection="list" item="rid" open="in(" separator="," close=")">
                #{rid}
            </foreach>
        </if>
        <if test="list == null or list.size() == 0">
            = -1
        </if>
    </select>

不算是这么上策,但也能解决问题,当list为空时,给id赋值一个-1,保证查不到数据,sql也没有语法错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值