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