溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

在Mybatis使用Integer與''進(jìn)行比較的坑如何解決

發(fā)布時(shí)間:2023-03-31 14:44:38 來源:億速云 閱讀:121 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“在Mybatis使用Integer與''進(jìn)行比較的坑如何解決”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“在Mybatis使用Integer與''進(jìn)行比較的坑如何解決”文章能幫助大家解決問題。

    使用Integer與''進(jìn)行比較的坑

    前段時(shí)間遇到一個(gè)bug,就是修改某一個(gè)integer類型的值的時(shí)候,除了修改為0 其他的值都可以進(jìn)行修改。只要想把這個(gè)字段改成0 就似乎沒有走update這個(gè)字段的語句。(前段時(shí)間比較忙也就沒有記下這個(gè)筆記)

    相信很多朋友在使用Mybatis的時(shí)候都會(huì)去使用通用一點(diǎn)的insert或者update語句,類似加入以下這種判斷來進(jìn)行復(fù)用。

    <if test="orgName != null and orgName != ''">
        orgName =#{orgName ,jdbcType=VARCHAR},
    </if>

    也就是只有orgName有有效值的時(shí)候才會(huì)進(jìn)入set語句,但是在對(duì)于Integer類型下的判斷就會(huì)有一定的影響。

    經(jīng)過我的測試發(fā)現(xiàn)mybatis會(huì)將Integer值的0等于空字符串''

    例如傳入的num的值為0,if標(biāo)簽里面一樣寫

    num != null and num != ''

    當(dāng)num的值為0 ,mybatis會(huì)當(dāng)做0等于空串,也就不會(huì)進(jìn)入此if里面的代碼塊。

    比如update語句,如果傳進(jìn)來的值為0那么這個(gè)字段就不會(huì)被update掉。

    也就是說在對(duì)Integer類型的值進(jìn)行判斷的時(shí)候,只需要加入!= null 即可。

    Integer類型參數(shù)在Mybatis中的比較問題

    案例

    當(dāng)使用mybatis傳入?yún)?shù)為Integer類型,使用條件構(gòu)造語句時(shí)偶爾會(huì)導(dǎo)致判斷錯(cuò)誤。如下

    select * from tbl_user where 1=1
    <if test="flag != null and flag != '' ">
        and flag = #{flag}
    </if>

    當(dāng)flag傳入?yún)?shù)為0,會(huì)導(dǎo)致條件構(gòu)造失敗;SQL執(zhí)行結(jié)果不是我們想要的

    原因分析

    mybatis在預(yù)編譯sql時(shí),使用OGNL表達(dá)式來解析if標(biāo)簽,對(duì)于Integer類型屬性,在判斷不等于''時(shí),會(huì)返回''的長度,也就是0

    源碼:

    (s.length() == 0) ? 0.0 : Double.parseDouble( s )

    因此表達(dá)式 flag != ''被當(dāng)做 flag != 0 來判斷,所以當(dāng)flag為0時(shí),if條件判斷不通過

    關(guān)于“在Mybatis使用Integer與''進(jìn)行比較的坑如何解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI