mybatis中 if-test 數(shù)字判斷的坑及解決
if-test數(shù)字判斷的坑
在項(xiàng)目中偶然發(fā)現(xiàn)一個(gè)判斷數(shù)字的if沒有起任何作用,代碼如下
<if test="timeType !=null and timeType!='' and timeType == '3'"> ? ? AND ? ? ... </if>
經(jīng)過查詢資料發(fā)現(xiàn),mybatis是用OGNL表達(dá)式來解析的,在OGNL的表達(dá)式中,數(shù)字’3’會(huì)被解析成字符,java是強(qiáng)類型的,char 和 一個(gè)string 會(huì)導(dǎo)致不等,所以if標(biāo)簽中的sql不會(huì)被解析。
所以應(yīng)該改為:
?<if test="timeType !=null and timeType!='' and timeType == '3'.toString() "> ? ? ? ? ? ? AND ? ? ? ? ? ? ... ?</if>
然后發(fā)現(xiàn)確實(shí)解決了這個(gè)問題,特此記錄。
mybatis的test判斷注意事項(xiàng)
在使用mybatis進(jìn)行判斷的時(shí)候,一定要注意傳入的數(shù)據(jù)類型與判斷的目標(biāo)值類型是否一致。
最近在一次開發(fā)過程,誤將一個(gè)傳入的整型數(shù)據(jù)使用了下面的判斷方式:
<if test="appType != null and appType != ''">
and a.c_appType = #{appType}
</if>其中,appType是一個(gè)整型數(shù)據(jù)??梢钥吹剑趖est判斷里面使用了 appType != ''。
在進(jìn)行業(yè)務(wù)功能測試的時(shí)候發(fā)現(xiàn),當(dāng)傳入的值是0時(shí),該條件篩選沒有起作用,通過調(diào)試發(fā)現(xiàn),mybatis會(huì)將空字符串轉(zhuǎn)換成double類型的0.0,如下圖所示:

同樣的,整數(shù)數(shù)據(jù)也會(huì)轉(zhuǎn)換為double類型,如下圖所示:

所以,mybatis在判斷的時(shí)候,數(shù)字0和空字符串是相等的,而我們的if判斷里,是兩者不相等時(shí)該條件才會(huì)起作用。
因此,在使用mybatis判斷的時(shí)候,一定要注意類型是否一致,數(shù)字類型就不要判斷空字符串的情況了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC框架使用jackson封裝數(shù)據(jù)過程中遇到的問題及解決
這篇文章主要介紹了SpringMVC框架使用jackson封裝數(shù)據(jù)過程中遇到的問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
基于Jenkins+Maven+Gitea+Nexus搭建CICD環(huán)境的方式
這篇文章主要介紹了基于Jenkins+Maven+Gitea+Nexus從0到1搭建CICD環(huán)境,大家都知道Nexus是一套“開箱即用”的系統(tǒng)不需要數(shù)據(jù)庫,它使用文件系統(tǒng)加Lucene來組織數(shù)據(jù),需要的朋友可以參考下2022-01-01
Maven打包SpringBoot工程的實(shí)現(xiàn)示例
在使用Spring Boot和Maven的項(xiàng)目中,你可以使用Maven來打包你的項(xiàng)目,本文主要介紹了Maven打包SpringBoot工程的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05

