mybatis的test坑及解決(不等于‘‘ 且 不等于0)
概述
mybatis使用xml過程中我們經(jīng)常會遇到要進(jìn)行動態(tài)sql的判斷,如使用if標(biāo)簽和choose標(biāo)簽中的when標(biāo)簽,都會遇到test條件判斷,test的條件判斷采用的ognl語句。
我遇到的坑是這樣的:
<select id="myFunction"> select * from student where 1=1 <if test="status!=null and status!='' and status==0"> and 2=2 </if> <if test="status!=null and status!='' and status!=0"> and 3=3 </if> </select>
然后當(dāng) status=1的時(shí)候程序能狗正常運(yùn)行并添加條件,但是當(dāng) status=0的時(shí)候死活無法進(jìn)入第一個(gè)條件判斷(當(dāng)時(shí)改變了多種寫法都不行,當(dāng)時(shí)心中千萬個(gè)草泥馬就過去了)。
問題原因
最后一直跟蹤查找原因,終于找到了錯誤的地方,以及出處。
原因就是如下語句:
status!=null and status!=‘' and status==0
是不成立的,因?yàn)閟tatus是Integer類型,當(dāng)進(jìn)行status!=null和status==0的判斷都是沒有問題的,但是在判斷status!='‘的時(shí)候問題就來了,既然這個(gè)屬性字段是Integer類型如何進(jìn)行字符串的判空呢?
看這個(gè)斷點(diǎn)截圖,當(dāng)status參數(shù)為0的時(shí)候進(jìn)行判斷status!=’‘的判斷的時(shí)候進(jìn)入這個(gè)位置,由斷點(diǎn)的位置可以知道,需要比較的是 0 和 ’‘是否相等,但是這兩個(gè)數(shù)據(jù)連類型都不同怎么能相等呢,但是mybatis進(jìn)行了轉(zhuǎn)換比較,但你的參數(shù)類型是不是基礎(chǔ)數(shù)據(jù)類型以及其包裝類的時(shí)候,他會把你的這個(gè)空進(jìn)行如下轉(zhuǎn)換:
由這個(gè)圖我們知道,最后這個(gè)0被轉(zhuǎn)換為 0.0 ,而這個(gè) ’‘ 被轉(zhuǎn)換為0.0,也就是說這個(gè)時(shí)候的判斷就變成了0.0與0.0的判斷。
所以最后在test語句中判斷參數(shù)值如下
0=='‘ //是成立的
就是成立的。
也就說當(dāng)我們的status=0的時(shí)候進(jìn)行test的參數(shù)判斷:
status!=null and status!=‘' and status==0
就變成了
status!=null and status!=0 and status==0
所以這個(gè)判斷語句永遠(yuǎn)都不可能成立。
問題解決
既然我們知道了原因,那么解決方案就是寫判斷語句ognl的時(shí)候一定要按照數(shù)據(jù)類型進(jìn)行,不要寫不屬于該參數(shù)類型的判斷方式。
如下:
status!=null and status==0
這樣就可以了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot詳解線程池與多線程及阻塞隊(duì)列的應(yīng)用詳解
本例應(yīng)用線程池、多線程、阻塞隊(duì)列處理一個(gè)流程任務(wù)。本例處理一個(gè)訂單流程,主要包括生成訂單、訂單處理、訂單入庫,下面我們一起看看2022-06-06兩種JAVA實(shí)現(xiàn)短網(wǎng)址服務(wù)算法
這篇文章介紹了兩種JAVA實(shí)現(xiàn)短網(wǎng)址服務(wù)算法,一種是基于MD5碼的,一種是基于自增序列的,需要的朋友可以參考下2015-07-07JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí))
這篇文章主要介紹了JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Java org.w3c.dom.Document 類方法引用報(bào)錯
這篇文章主要介紹了Java org.w3c.dom.Document 類方法引用報(bào)錯的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08springboot返回圖片流的實(shí)現(xiàn)示例
本文主要介紹了springboot返回圖片流的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08