1. 程式人生 > 程式設計 >mybatis寫xml時數字型別千萬別用 !=‘‘(不為空串)進行判斷的示例詳解

mybatis寫xml時數字型別千萬別用 !=‘‘(不為空串)進行判斷的示例詳解

前言

最近專案內更新資料時,發現數字型別欄位設定為0時不能正常的更新進資料庫,我們列印了下mybatis的sql日誌發現欄位為0的sql沒有被拼接。

樣例

下面的是錯誤示例 ❌

<update id="update" parameterType="com.chengfengfeng.test.domain.People">
    update people
    set
    <if test="age!=null and age !=''">
      age=#{age},</if>,modified = sysdate()
    where user_id = #{userId}
 </update>

age是個int型別的資料,我們在寫age判斷的時候就增加上了判斷age!='',這個是存在問題的。
正確的示例 ✅

<update id="update" parameterType="com.chengfengfeng.test.domain.People">
    update people
    set
    <if test="age!=null">
      age=#{age},modified = sysdate()
    where user_id = #{userId}
 </update>

原因是什麼呢

跟蹤了下程式碼,發現在解析xml時數字型別會走下面的判斷

public abstract class OgnlOps implements NumericTypes {
	//省略其他無用程式碼
  public static double doubleValue(Object value) throws NumberFormatException {
    if (value == null) {
      return 0.0D;
    } else {
      Class c = value.getClass();
      if (c.getSuperclass() == Number.class) {
        return ((Number)value).doubleValue();
      } else if (c == Boolean.class) {
        return (Boolean)value ? 1.0D : 0.0D;
      } else if (c == Character.class) {
        return (double)(Character)value;
      } else {
        String s = stringValue(value,true);
        //這個位置會把'‘空串處理成0
        return s.length() == 0 ? 0.0D : Double.parseDouble(s);
      }
    }
  }
}

我們看上面最後一段程式碼,會把''轉換成0.0D,那麼我們的最開始的if判斷就變成了age != 0,所以當我們把age設定為0時,結果就變成了false,導致sql不會進行拼接,更新資料失敗。

到此這篇關於mybatis寫xml時數字型別千萬別用 !=‘‘(不為空串)進行判斷的示例詳解的文章就介紹到這了,更多相關mybatis寫xml數字型別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!