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