欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年09月21日 14:50:58   作者:程馮馮  
這篇文章主要介紹了mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進行判斷的示例詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

最近項目內(nèi)更新數(shù)據(jù)時,發(fā)現(xiàn)數(shù)字類型字段設(shè)置為0時不能正常的更新進數(shù)據(jù)庫,我們打印了下mybatis的sql日志發(fā)現(xiàn)字段為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類型的數(shù)據(jù),我們在寫age判斷的時候就增加上了判斷age!='',這個是存在問題的。
正確的示例 ✅

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

原因是什么呢

跟蹤了下代碼,發(fā)現(xiàn)在解析xml時數(shù)字類型會走下面的判斷

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);
      }
    }
  }
}

我們看上面最后一段代碼,會把''轉(zhuǎn)換成0.0D,那么我們的最開始的if判斷就變成了age != 0,所以當(dāng)我們把age設(shè)置為0時,結(jié)果就變成了false,導(dǎo)致sql不會進行拼接,更新數(shù)據(jù)失敗。

到此這篇關(guān)于mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進行判斷的示例詳解的文章就介紹到這了,更多相關(guān)mybatis寫xml數(shù)字類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 服務(wù)器CPU高居不下,JAVA線程占用排查方式

    服務(wù)器CPU高居不下,JAVA線程占用排查方式

    這篇文章主要介紹了服務(wù)器CPU高居不下,JAVA線程占用排查方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot的@Value給靜態(tài)變量注入application.properties屬性值

    SpringBoot的@Value給靜態(tài)變量注入application.properties屬性值

    這篇文章主要介紹了SpringBoot的@Value給靜態(tài)變量注入application.properties屬性值,Spring是一個開源的框架,主要是用來簡化開發(fā)流程,通過IOC,依賴注入(DI)和面向接口實現(xiàn)松耦合,需要的朋友可以參考下
    2023-05-05
  • Java啟動Tomcat的實現(xiàn)步驟

    Java啟動Tomcat的實現(xiàn)步驟

    本文主要介紹了Java啟動Tomcat的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • SpringBoot整合atomikos實現(xiàn)跨庫事務(wù)的詳細方案

    SpringBoot整合atomikos實現(xiàn)跨庫事務(wù)的詳細方案

    這篇文章主要介紹了SpringBoot整合atomikos實現(xiàn)跨庫事務(wù),業(yè)務(wù)主要涉及政府及企業(yè)且并發(fā)量不大,所以采用XA事務(wù),雖然性能有所損失,但是可以保證數(shù)據(jù)的強一致性,需要的朋友可以參考下
    2022-06-06
  • JMeter中的后端監(jiān)聽器的實現(xiàn)

    JMeter中的后端監(jiān)聽器的實現(xiàn)

    本文主要介紹了JMeter中的后端監(jiān)聽器的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 如何構(gòu)建可重復(fù)讀取inputStream的request

    如何構(gòu)建可重復(fù)讀取inputStream的request

    這篇文章主要介紹了如何構(gòu)建可重復(fù)讀取inputStream的request,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 一個簡單的SpringBoot項目快速搭建詳細步驟

    一個簡單的SpringBoot項目快速搭建詳細步驟

    Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,下面這篇文章主要給大家介紹了一個簡單的SpringBoot項目快速搭建詳細步驟,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Spring Security+Spring Data Jpa如何進行安全管理

    Spring Security+Spring Data Jpa如何進行安全管理

    這篇文章主要介紹了Spring Security+Spring Data Jpa如何進行安全管理,幫助大家更好的理解和學(xué)習(xí)Spring Security框架,感興趣的朋友可以了解下
    2020-09-09
  • Java FastJson使用教程

    Java FastJson使用教程

    這篇文章主要介紹了如何使用FastJson,幫助大家將 Java 對象轉(zhuǎn)換為 JSON 格式,感興趣的朋友可以了解下
    2020-10-10
  • Java 多線程有序執(zhí)行的幾種方法總結(jié)

    Java 多線程有序執(zhí)行的幾種方法總結(jié)

    這篇文章主要介紹了Java 多線程有序執(zhí)行的幾種方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評論