1. 程式人生 > 其它 >mybatis foreach list特殊處理

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也沒有語法錯誤。