您好,登錄后才能下訂單哦!
今天小編給大家分享一下mybatis的test坑怎么解決的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
mybatis使用xml過程中我們經常會遇到要進行動態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參數為0的時候進行判斷status!=’‘的判斷的時候進入這個位置,由斷點的位置可以知道,需要比較的是 0 和 ’‘是否相等,但是這兩個數據連類型都不同怎么能相等呢,但是mybatis進行了轉換比較,但你的參數類型是不是基礎數據類型以及其包裝類的時候,他會把你的這個空進行如下轉換:
由這個圖我們知道,最后這個0被轉換為 0.0 ,而這個 ’‘ 被轉換為0.0,也就是說這個時候的判斷就變成了0.0與0.0的判斷。
所以最后在test語句中判斷參數值如下
0=='‘ //是成立的
就是成立的。
也就說當我們的status=0的時候進行test的參數判斷:
status!=null and status!=‘' and status==0
就變成了
status!=null and status!=0 and status==0
所以這個判斷語句永遠都不可能成立。
既然我們知道了原因,那么解決方案就是寫判斷語句ognl的時候一定要按照數據類型進行,不要寫不屬于該參數類型的判斷方式。
如下:
status!=null and status==0
這樣就可以了。
以上就是“mybatis的test坑怎么解決”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。