mybatis中 if test判斷容易踩的坑

問題描述

起因是在某次mybatis的select語句中使用了

update *** set
...
<if test="user.count"> count = #{user.count},</if>
...

來執(zhí)行更新user表各字段,然后發(fā)現count = 0的時候不會觸發(fā)count字段的更新,導致了bug出現。

解決方法和原因

猜測可能是源碼里面把0, '', null都當作null來處理,類似弱類型的判斷,所以嘗試修改代碼:

<if test="user.count != null"> count = #{user.count},</if>

這次成功觸發(fā)了更新,果然是上述問題。

查找相關資料后大概了解了原因,其實mybatis底層是用OGNL表達式來解析的,而這個表達式會把number類型的非0解析為true,把0解析為false,導致上述問題觸發(fā),OGNL官網的描述如下:

Interpreting Objects as Booleans
Any object can be used where a boolean is required. OGNL interprets objects as booleans like this:</br>

  • If the object is a Boolean, its value is extracted and returned;</br>
  • If the object is a Number, its double-precision floating-point value is compared with zero; non-zero is treated as true, zero as false;</br>
  • If the object is a Character, its boolean value is true if and only if its char value is non-zero;</br>
  • Otherwise, its boolean value is true if and only if it is non-null.

所以修改為 !=null即可解決這個類型轉換的問題。

參考文章:

https://www.cnblogs.com/grasp/p/11268049.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容