mybatis中 if-test 數字判斷的坑及解決
if-test數字判斷的坑
在項目中偶然發現一個判斷數字的if沒有起任何作用,代碼如下
<if test="timeType !=null and timeType!='' and timeType == '3'"> AND ... </if>
經過查詢資料發現,mybatis是用OGNL表達式來解析的,在OGNL的表達式中,數字’3’會被解析成字符,java是強類型的,char 和 一個string 會導致不等,所以if標簽中的sql不會被解析。
所以應該改為:
<if test="timeType !=null and timeType!='' and timeType == '3'.toString() "> AND ... </if>
然後發現確實解決瞭這個問題,特此記錄。
mybatis的test判斷註意事項
在使用mybatis進行判斷的時候,一定要註意傳入的數據類型與判斷的目標值類型是否一致。
最近在一次開發過程,誤將一個傳入的整型數據使用瞭下面的判斷方式:
<if test="appType != null and appType != ''"> and a.c_appType = #{appType} </if>
其中,appType是一個整型數據。可以看到,在test判斷裡面使用瞭 appType != ''。
在進行業務功能測試的時候發現,當傳入的值是0時,該條件篩選沒有起作用,通過調試發現,mybatis會將空字符串轉換成double類型的0.0,如下圖所示:
同樣的,整數數據也會轉換為double類型,如下圖所示:
所以,mybatis在判斷的時候,數字0和空字符串是相等的,而我們的if判斷裡,是兩者不相等時該條件才會起作用。
因此,在使用mybatis判斷的時候,一定要註意類型是否一致,數字類型就不要判斷空字符串的情況瞭。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- mybatis動態SQL if的test寫法及規則詳解
- mybatis test標簽如何判斷值是否相等
- MyBatis的9種動態標簽詳解
- MyBatis中關於SQL的寫法總結
- Mybatis如何使用ognl表達式實現動態sql