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

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

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

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

我?guī)湍惆?字符串StrUtil.isNotBlank(),非字符串ObjectUtil.isNotNull() 的完整 MyBatis updateById 版本寫好,這樣判斷邏輯會(huì)很統(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>

對(duì)比優(yōu)化

原本 MyBatis 寫法

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

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

現(xiàn)在 Hutool 寫法

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

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

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

這個(gè)現(xiàn)象其實(shí)是 MyBatis + OGNL 的自動(dòng)類型推斷 惹的禍。

你這里:

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

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

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

為什么status變成Long?

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

為什么 price 沒(méi)事?

BigDecimal 類型在 OGNL 里不會(huì)被誤判去做字符串轉(zhuǎn)換,因?yàn)樗緛?lái)就不是 CharSequence,且 ObjectUtil.isNotNull() 的簽名 isNotNull(Object) 匹配得很干脆,沒(méi)有觸發(fā)額外的類型推斷。

怎么解決?

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

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

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

如果你一定要用 ObjectUtil.isNotNull

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

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

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

原因很簡(jiǎn)單:

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

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

1.!= null

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

2.StrUtil.isNotBlank()

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

結(jié)論

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

建議:

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

    Java位運(yùn)算和邏輯運(yùn)算的區(qū)別實(shí)例

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

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

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

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

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

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

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

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

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

最新評(píng)論

平顺县| 台南市| 富锦市| 南开区| 桃园县| 武夷山市| 阿图什市| 青川县| 晋城| 永嘉县| 南川市| 玉树县| 建平县| 中方县| 克东县| 霞浦县| 靖远县| 同心县| 金平| 新平| 广灵县| 诸暨市| 湖州市| 克什克腾旗| 洛阳市| 长子县| 禹州市| 杂多县| 扎赉特旗| 金川县| 南投县| 津市市| 黄冈市| 马尔康县| 盐城市| 如皋市| 晋宁县| 通辽市| 外汇| 康平县| 都兰县|