在Mybatis使用Integer與''進(jìn)行比較的坑及解決
使用Integer與''進(jìn)行比較的坑
前段時間遇到一個bug,就是修改某一個integer類型的值的時候,除了修改為0 其他的值都可以進(jìn)行修改。只要想把這個字段改成0 就似乎沒有走update這個字段的語句。(前段時間比較忙也就沒有記下這個筆記)
相信很多朋友在使用Mybatis的時候都會去使用通用一點的insert或者update語句,類似加入以下這種判斷來進(jìn)行復(fù)用。
<if test="orgName != null and orgName != ''">
? ? orgName =#{orgName ,jdbcType=VARCHAR},
</if>也就是只有orgName有有效值的時候才會進(jìn)入set語句,但是在對于Integer類型下的判斷就會有一定的影響。
經(jīng)過我的測試發(fā)現(xiàn)mybatis會將Integer值的0等于空字符串''
例如傳入的num的值為0,if標(biāo)簽里面一樣寫
num != null and num != ''
當(dāng)num的值為0 ,mybatis會當(dāng)做0等于空串,也就不會進(jìn)入此if里面的代碼塊。
比如update語句,如果傳進(jìn)來的值為0那么這個字段就不會被update掉。
也就是說在對Integer類型的值進(jìn)行判斷的時候,只需要加入!= null 即可。
Integer類型參數(shù)在Mybatis中的比較問題
案例
當(dāng)使用mybatis傳入?yún)?shù)為Integer類型,使用條件構(gòu)造語句時偶爾會導(dǎo)致判斷錯誤。如下
select * from tbl_user where 1=1
<if test="flag != null and flag != '' ">
? ? and flag = #{flag}
</if>當(dāng)flag傳入?yún)?shù)為0,會導(dǎo)致條件構(gòu)造失??;SQL執(zhí)行結(jié)果不是我們想要的
原因分析
mybatis在預(yù)編譯sql時,使用OGNL表達(dá)式來解析if標(biāo)簽,對于Integer類型屬性,在判斷不等于''時,會返回''的長度,也就是0
源碼:
(s.length() == 0) ? 0.0 : Double.parseDouble( s )
因此表達(dá)式 flag != ''被當(dāng)做 flag != 0 來判斷,所以當(dāng)flag為0時,if條件判斷不通過
總結(jié)
if條件判斷number類型,沒必要判斷''的情況,只需判斷null的情況即可;
如果非要判斷''的情況,那么要考慮到等于0的情況,即<if test="flag != '' or flag == 0">
最后
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java阻塞隊列必看類:BlockingQueue快速了解大體框架和實現(xiàn)思路
這篇文章主要介紹了Java阻塞隊列必看類:BlockingQueue快速了解大體框架和實現(xiàn)思路,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10

