最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis的xml中字符串類型判空與非字符串類型判空處理方式(最新整理)

 更新時間:2025年08月11日 14:50:51   作者:會滑冰的北極熊  
本文給大家介紹MyBatis的xml中字符串類型判空與非字符串類型判空處理方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

orderNo != null 這種非字符串類型的判斷,也能用 Java 靜態(tài)方法來替代,比如用 Hutool 的 ObjectUtil.isNotNull()ObjectUtil.isNotEmpty()

我?guī)湍惆?字符串StrUtil.isNotBlank(),非字符串ObjectUtil.isNotNull() 的完整 MyBatis updateById 版本寫好,這樣判斷邏輯會很統(tǒng)一。

完整 Hutool 寫法版本

<update id="updateById" parameterType="com.example.NursingProject">
    UPDATE nursing_project
    <set>
        <if test="@cn.hutool.core.util.StrUtil@isNotBlank(name)">
            name = #{name},
        </if>
        <if test="@cn.hutool.core.util.ObjectUtil@isNotNull(orderNo)">
            order_no = #{orderNo},
        </if>
        <if test="@cn.hutool.core.util.StrUtil@isNotBlank(unit)">
            unit = #{unit},
        </if>
        <if test="@cn.hutool.core.util.ObjectUtil@isNotNull(price)">
            price = #{price},
        </if>
        <if test="@cn.hutool.core.util.StrUtil@isNotBlank(image)">
            image = #{image},
        </if>
        <if test="@cn.hutool.core.util.StrUtil@isNotBlank(nursingRequirement)">
            nursing_requirement = #{nursingRequirement},
        </if>
        <if test="@cn.hutool.core.util.ObjectUtil@isNotNull(status)">
            status = #{status},
        </if>
        <if test="@cn.hutool.core.util.StrUtil@isNotBlank(createBy)">
            create_by = #{createBy},
        </if>
        <if test="@cn.hutool.core.util.StrUtil@isNotBlank(updateBy)">
            update_by = #{updateBy},
        </if>
        <if test="@cn.hutool.core.util.StrUtil@isNotBlank(remark)">
            remark = #{remark},
        </if>
        <if test="@cn.hutool.core.util.ObjectUtil@isNotNull(updateTime)">
            update_time = #{updateTime},
        </if>
    </set>
    WHERE id = #{id}
</update>

對比優(yōu)化

原本 MyBatis 寫法

<if test="orderNo != null">...</if>

需要區(qū)分字符串、數(shù)字、對象分別寫不同條件。

現(xiàn)在 Hutool 寫法

字符串StrUtil.isNotBlank()(避免空格也被當(dāng)作有效值)

數(shù)字/對象ObjectUtil.isNotNull()(僅判斷 null,不管 0/false)

這樣代碼風(fēng)格統(tǒng)一,可讀性也更好。

這個現(xiàn)象其實是 MyBatis + OGNL 的自動類型推斷 惹的禍。

你這里:

<if test="@cn.hutool.core.util.ObjectUtil@isNotNull(price)">
    price = #{price},
</if>
<if test="@cn.hutool.core.util.ObjectUtil@isNotNull(status)">
    status = #{status},
</if>

表面上看用的都是同一個 ObjectUtil.isNotNull(),但實際上 pricestatus 的運行時類型不一樣:

字段Java 類型JSON 傳值類型MyBatis 解析時的實際類型
priceBigDecimal50java.math.BigDecimal
statusInteger1java.lang.Long

為什么status變成Long?

MyBatis 在 JSON 反序列化(或者參數(shù)綁定)時,如果是整數(shù)值但沒有顯式指定類型,很多情況下會用 Long 表示(尤其是 Map 或動態(tài) SQL 場景中)。
ObjectUtil.isNotNull(1L) 本身沒問題,但在 OGNL 調(diào)用靜態(tài)方法時,有些版本的 MyBatis/OGNL 會先嘗試做類型轉(zhuǎn)換(尤其是如果方法簽名有重載或匹配不明確時),于是會觸發(fā) "Unable to convert type java.lang.Long to java.lang.CharSequence" 這種異常。

為什么 price 沒事?

BigDecimal 類型在 OGNL 里不會被誤判去做字符串轉(zhuǎn)換,因為它本來就不是 CharSequence,且 ObjectUtil.isNotNull() 的簽名 isNotNull(Object) 匹配得很干脆,沒有觸發(fā)額外的類型推斷。

怎么解決?

最穩(wěn)妥的方式就是 不要用靜態(tài)方法去判斷 null,直接用 OGNL 原生的 null 判斷:

<if test="price != null">
    price = #{price},
</if>
<if test="status != null">
    status = #{status},
</if>

這樣不涉及靜態(tài)方法匹配,就不會出現(xiàn) Long 轉(zhuǎn) CharSequence 的問題。

如果你一定要用 ObjectUtil.isNotNull

<if test="@cn.hutool.core.util.ObjectUtil@isNotNull((Object)status)">
    status = #{status},
</if>

(Object) 是為了讓 OGNL 不去嘗試把 Long 當(dāng)作別的類型匹配。

如果單純比較性能,原生 != null 判斷 會明顯比 StrUtil.isNotBlank() 快。

原因很簡單:

判斷方式邏輯性能分析
!= null直接用 OGNL 判斷對象是否為 null,屬于一次簡單的引用比較O(1) 操作,幾乎沒有額外開銷
StrUtil.isNotBlank()Hutool 工具方法,需要靜態(tài)方法調(diào)用 + 類型檢查 + 遍歷字符串判斷空格至少多了方法調(diào)用開銷 + 字符遍歷(字符串越長耗時越多)

舉個例子(粗略對比執(zhí)行步驟):

1.!= null

  • MyBatis OGNL:取值
  • JVM:引用地址是否為 null → true/false
  • 總耗時 ≈ 一次內(nèi)存地址比較

2.StrUtil.isNotBlank()

  • MyBatis OGNL:加載 StrUtil
  • JVM:調(diào)用靜態(tài)方法
  • 方法內(nèi)部:
    • 判斷對象是否為 null
    • 調(diào)用 String.length()
    • 遍歷每個字符判斷是否為空格字符
  • 總耗時 ≈ 多次方法調(diào)用 + 字符遍歷

結(jié)論

  • 非字符串類型!= null 是最優(yōu)方案(少步驟、無額外邏輯)
  • 字符串類型 → 如果需要判斷空字符串和全空格情況,那必須用 isNotBlank()(功能多,但慢一點)
  • 如果字符串允許空格或空值存儲,不做空格判斷,用 != null 會快很多

建議:

  • 數(shù)值、日期、枚舉 → 全部用 != null
  • 字符串 → 如果必須去掉空格判斷為空,才用 isNotBlank();否則也用 != null

到此這篇關(guān)于MyBatis的xml中字符串類型判空與非字符串類型判空處理方式的文章就介紹到這了,更多相關(guān)MyBatis xml字符串類型判空內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue實現(xiàn)驗證碼登錄的超詳細(xì)步驟

    Vue實現(xiàn)驗證碼登錄的超詳細(xì)步驟

    這篇文章主要給大家介紹了關(guān)于Vue實現(xiàn)驗證碼登錄的超詳細(xì)步驟,我們在使用vue進(jìn)行前端開發(fā)時都需要登錄驗證,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目

    如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目

    這篇文章主要介紹了如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目,大家在使用idea開發(fā)工具時發(fā)現(xiàn)給以往的版本略微的不同,細(xì)心的小編在此記錄下,需要的朋友可以參考下
    2022-08-08
  • JDBC如何訪問MySQL數(shù)據(jù)庫,并增刪查改

    JDBC如何訪問MySQL數(shù)據(jù)庫,并增刪查改

    這篇文章主要介紹了JDBC如何訪問MySQL數(shù)據(jù)庫,幫助大家更好的理解和學(xué)習(xí)java與MySQL,感興趣的朋友可以了解下
    2020-08-08
  • Java大數(shù)據(jù)處理的核心技術(shù)MapReduce框架

    Java大數(shù)據(jù)處理的核心技術(shù)MapReduce框架

    MapReduce是一種分布式計算框架,適用于大規(guī)模的數(shù)據(jù)處理。它將大數(shù)據(jù)分成多個小數(shù)據(jù)塊,通過Map和Reduce兩個階段對數(shù)據(jù)進(jìn)行處理和分析。MapReduce框架具有可靠、高效、可擴展等特點,已經(jīng)成為大數(shù)據(jù)處理的核心技術(shù)
    2023-05-05
  • 如何實現(xiàn)Spring?Event(異步事件)

    如何實現(xiàn)Spring?Event(異步事件)

    這篇文章主要介紹了如何實現(xiàn)Spring?Event(異步事件)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java位運算和邏輯運算的區(qū)別實例

    Java位運算和邏輯運算的區(qū)別實例

    Java位運算和邏輯運算的區(qū)別實例,請參考下面代碼,希望對你有所幫助
    2013-02-02
  • MyBatis-Plus實現(xiàn)連表查詢的方法實例

    MyBatis-Plus實現(xiàn)連表查詢的方法實例

    這篇文章主要給大家介紹了關(guān)于MyBatis-Plus實現(xiàn)連表查詢的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • JDK1.8與JDK17多版本共存相互切換(windows、macOS、Linux、IDE)

    JDK1.8與JDK17多版本共存相互切換(windows、macOS、Linux、IDE)

    在電腦已經(jīng)安裝之前主流的jdk1.8后避免不了要安裝新的主流jdk17,本章主要目的是介紹不同項目和場景間切換JDK?1.8和JDK?17,提高開發(fā)效率并避免版本沖突(包括windows、macOS、Linux、IDE)
    2025-12-12
  • 普通對象使用spring容器中的對象的實現(xiàn)方法

    普通對象使用spring容器中的對象的實現(xiàn)方法

    這篇文章主要介紹了普通對象使用spring容器中的對象的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • spring mvc利用ajax向controller傳遞對象的方法示例

    spring mvc利用ajax向controller傳遞對象的方法示例

    這篇文章主要給大家介紹了關(guān)于spring mvc利用ajax向controller傳遞對象的相關(guān)資料,文中通過示例代碼將步驟介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07

最新評論

柳林县| 蒙阴县| 元氏县| 梓潼县| 旬阳县| 绥宁县| 故城县| 南阳市| 镶黄旗| 防城港市| 天门市| 长葛市| 台安县| 文化| 宣汉县| 福州市| 东至县| 乡城县| 肃宁县| 临城县| 南陵县| 涟源市| 玛沁县| 肇源县| 高邮市| 讷河市| 维西| 和顺县| 子洲县| 武城县| 青冈县| 白河县| 池州市| 奉贤区| 普宁市| 施甸县| 葫芦岛市| 福建省| 会理县| 濉溪县| 交口县|