mybatis foreach list特殊處理
阿新 • • 發佈:2021-06-24
最近做一個功能,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也沒有語法錯誤。