Mybatis之foreach標(biāo)簽內(nèi)傳入list為空的問(wèn)題
foreach標(biāo)簽內(nèi)傳入list為空的問(wèn)題
復(fù)盤(pán)一下填過(guò)的坑
mybatis中,如果不對(duì)list就行判空處理,就會(huì)出現(xiàn)當(dāng)list為空或者list.size=0時(shí)拋異常,
錯(cuò)誤示例如下:
SELECT * FROM table_xxx (NOLOCK) WHERE id in <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach>
解決方案如下:(推薦第二種)
1、對(duì)list判null和判空來(lái)處理
使用mybatis進(jìn)行in()判斷的時(shí)候傳入?yún)?shù)為L(zhǎng)ist,需要判斷List是否為空了,當(dāng)然可以在java代碼中進(jìn)行判斷,但是我不想每次調(diào)用該方法都要進(jìn)行判斷,所有最好還是在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、對(duì)list判null和判空來(lái)處理(墻裂推薦)
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特殊處理
最近做一個(gè)功能,sql要用到 IN 條件,通過(guò)list傳入IN 的值,如:
SELECT * FROM table1 WHERE id in (1,2,3)
對(duì)應(yīng)的mybatis寫(xiě)法為:
<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的值進(jìn)行查詢。
可是,當(dāng)list為空的時(shí)候呢?
sql應(yīng)該是這樣的
SELECT * FROM table1 WHERE id in ()
直接在mysql中運(yùn)行肯定是語(yǔ)法錯(cuò)誤的。
無(wú)論如何是不會(huì)查到數(shù)據(jù)的,但mybatis又是什么策略呢?直接把這一條where條件給我忽略了…導(dǎo)致查全表數(shù)據(jù)。
這也不好說(shuō)mybatis做的好不好,算不算bug了。
既然知道套路了,就得有策略來(lái)應(yīng)對(duì)了。于是多寫(xiě)了兩個(gè)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>
不算是這么上策,但也能解決問(wèn)題,當(dāng)list為空時(shí),給id賦值一個(gè)-1,保證查不到數(shù)據(jù),sql也沒(méi)有語(yǔ)法錯(cuò)誤。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA時(shí)間戳-Calendar類使用(包括set,get,add方法)
這篇文章主要介紹了JAVA時(shí)間戳-Calendar類使用(包括set,get,add方法),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Java中對(duì)list map根據(jù)map某個(gè)key值進(jìn)行排序的方法
今天小編就為大家分享一篇Java中對(duì)list map根據(jù)map某個(gè)key值進(jìn)行排序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07java實(shí)現(xiàn)的日期時(shí)間轉(zhuǎn)換工具類完整示例
這篇文章主要介紹了java實(shí)現(xiàn)的日期時(shí)間轉(zhuǎn)換工具類,結(jié)合完整實(shí)例形式分析了java針對(duì)日期時(shí)間常見(jiàn)的轉(zhuǎn)換、計(jì)算、格式化等相關(guān)操作與封裝技巧,需要的朋友可以參考下2019-10-10Java Spring框架簡(jiǎn)介與Spring IOC詳解
Spring 框架是一個(gè)輕量級(jí)的解決方案,可以一站式地構(gòu)建企業(yè)級(jí)應(yīng)用。它是為了解決 企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的。Spring 使用基本的 JavaBean 來(lái)完成以前只可能由 EJB 完成的事情。IOC 是 Inversion of Control 的縮寫(xiě),多數(shù)書(shū)籍翻譯成控制反轉(zhuǎn)2021-09-09基于java file 文件操作operate file of java的應(yīng)用
本篇文章介紹了,基于java file 文件操作operate file of java的應(yīng)用。需要的朋友參考下2013-05-05Spring?Boot在開(kāi)發(fā)過(guò)程中常用IDEA插件
這篇文章主要為大家介紹了Spring?Boot在開(kāi)發(fā)過(guò)程中常用IDEA插件,幫助大家提高開(kāi)發(fā)工作效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Spring boot actuator端點(diǎn)啟用和暴露操作
這篇文章主要介紹了Spring boot actuator端點(diǎn)啟用和暴露操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07淺談一個(gè)基礎(chǔ)的SpringBoot項(xiàng)目該包含哪些
這篇文章主要介紹了淺談一個(gè)基礎(chǔ)的SpringBoot項(xiàng)目該包含哪些,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10淺談Sharding-JDBC強(qiáng)制路由案例實(shí)戰(zhàn)
本文主要介紹了淺談Sharding-JDBC強(qiáng)制路由案例實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07