欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis的test坑及解決(不等于‘‘ 且 不等于0)

 更新時(shí)間:2023年03月30日 16:49:51   作者:Lou_Lan  
這篇文章主要介紹了mybatis的test坑及解決(不等于‘‘ 且 不等于0),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

概述

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)文章

  • Java中反射詳解

    Java中反射詳解

    本文主要介紹了Java中反射的相關(guān)知識。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • Spring Boot 自定義starter的示例代碼

    Spring Boot 自定義starter的示例代碼

    這篇文章主要介紹了Spring Boot 自定義starter的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • Springboot詳解線程池與多線程及阻塞隊(duì)列的應(yīng)用詳解

    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ù)算法

    這篇文章介紹了兩種JAVA實(shí)現(xiàn)短網(wǎng)址服務(wù)算法,一種是基于MD5碼的,一種是基于自增序列的,需要的朋友可以參考下
    2015-07-07
  • JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí))

    JAVA隨機(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-04
  • Java org.w3c.dom.Document 類方法引用報(bào)錯

    Java org.w3c.dom.Document 類方法引用報(bào)錯

    這篇文章主要介紹了Java org.w3c.dom.Document 類方法引用報(bào)錯的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java?Redisson多策略注解限流

    Java?Redisson多策略注解限流

    這篇文章主要介紹了Java?Redisson多策略注解限流,文章使用Redisson的RRateLimiter進(jìn)行限流,詳細(xì)介紹,感興趣的小伙伴可以參考下面文章內(nèi)容
    2022-09-09
  • springboot返回圖片流的實(shí)現(xiàn)示例

    springboot返回圖片流的實(shí)現(xiàn)示例

    本文主要介紹了springboot返回圖片流的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java 添加、替換、刪除PDF中的圖片的示例代碼

    Java 添加、替換、刪除PDF中的圖片的示例代碼

    這篇文章主要介紹了Java 添加、替換、刪除PDF中的圖片,本文通過示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java中對象快速復(fù)制的幾種方式詳解

    Java中對象快速復(fù)制的幾種方式詳解

    這篇文章主要介紹了Java中對象快速復(fù)制的幾種方式詳解,對象的克隆是指創(chuàng)建一個(gè)新的對象,且新的對象的狀態(tài)與原始對象的狀態(tài)相同,當(dāng)對克隆的新對象進(jìn)行修改時(shí),不會影響原始對象的狀態(tài),需要的朋友可以參考下
    2023-08-08

最新評論