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。

推薦閱讀: