Mybatis之foreach標簽內(nèi)傳入list為空的問題
foreach標簽內(nèi)傳入list為空的問題
復(fù)盤一下填過的坑
mybatis中,如果不對list就行判空處理,就會出現(xiàn)當(dāng)list為空或者list.size=0時拋異常,
錯誤示例如下:
SELECT * FROM table_xxx (NOLOCK) WHERE id in <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach>
解決方案如下:(推薦第二種)
1、對list判null和判空來處理
使用mybatis進行in()判斷的時候傳入?yún)?shù)為List,需要判斷List是否為空了,當(dāng)然可以在java代碼中進行判斷,但是我不想每次調(diào)用該方法都要進行判斷,所有最好還是在mybatis的sql配置文件中判斷
配置如下:
SELECT * FROM table_xxx (NOLOCK) WHERE isactive=1 <if test="list != null and list.size() > 0"> id in <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </if>
2、對list判null和判空來處理(墻裂推薦)
SELECT * FROM table_xxx (NOLOCK) WHERE isActive=1 <foreach collection="list" index="index" item="item" open="AND id IN (" separator="," close=")"> #{item} </foreach>
mybatis foreach list特殊處理
最近做一個功能,sql要用到 IN 條件,通過list傳入IN 的值,如:
SELECT * FROM table1 WHERE id in (1,2,3)
對應(yīng)的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>
期望結(jié)果是按list的值進行查詢。
可是,當(dāng)list為空的時候呢?
sql應(yīng)該是這樣的
SELECT * FROM table1 WHERE id in ()
直接在mysql中運行肯定是語法錯誤的。
無論如何是不會查到數(shù)據(jù)的,但mybatis又是什么策略呢?直接把這一條where條件給我忽略了…導(dǎo)致查全表數(shù)據(jù)。
這也不好說mybatis做的好不好,算不算bug了。
既然知道套路了,就得有策略來應(yīng)對了。于是多寫了兩個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>
不算是這么上策,但也能解決問題,當(dāng)list為空時,給id賦值一個-1,保證查不到數(shù)據(jù),sql也沒有語法錯誤。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA時間戳-Calendar類使用(包括set,get,add方法)
這篇文章主要介紹了JAVA時間戳-Calendar類使用(包括set,get,add方法),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Java中對list map根據(jù)map某個key值進行排序的方法
今天小編就為大家分享一篇Java中對list map根據(jù)map某個key值進行排序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07java實現(xiàn)的日期時間轉(zhuǎn)換工具類完整示例
這篇文章主要介紹了java實現(xiàn)的日期時間轉(zhuǎn)換工具類,結(jié)合完整實例形式分析了java針對日期時間常見的轉(zhuǎn)換、計算、格式化等相關(guān)操作與封裝技巧,需要的朋友可以參考下2019-10-10基于java file 文件操作operate file of java的應(yīng)用
本篇文章介紹了,基于java file 文件操作operate file of java的應(yīng)用。需要的朋友參考下2013-05-05