MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

2025-08-11 22:50

本文主要是介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或...

orderNo != null 这种非字符串类型的判断,也能用 Java 静态方法来替代,比如用 Hutool 的 ObjectUtil.isNotNull()ObjectUtil.isNotEmpty()

我帮你把 字符串StrUtil.isNotBlank()非字符串ObjectUtil.isNotNull() 的完整 MyBATis updateById 版本写好,这样判断逻辑会很统一。

完整 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>

对比优化

原本 MyBatis 写法

<if test=www.chinasem.cn"orderNo != null">...</if>

需要区分字符串、数字、对象分别写不同条件。

现在 Hutool 写法

字符串StrUtil.isNotBlank()(避免空格也被当作有效值)

数字/对象ObjectUtil.isNotNull()(仅判断 null,不管 0/false)

这样代码风格统一,可读性也更好。

这个现象其实是 MyBatis + OGNL 的自动类型推断 惹的祸。

你这里:

<if test="@cn.hutool.core.util.ObjectUtil@isNotNull(price)">
    pricehttp://www.chinasem.cn = #{price},
</if>
<if test="@cn.hutool.core.util.ObjectUtpythonil@javascriptisNotNull(status)">
    status = #{status},
</if>

表面上看用的都是同一个 ObjectUtil.isNotNull(),但实际上 pricestatus 的运行时类型不一样:

字段Java 类型jsON 传值类型MyBatis 解析时的实际类型
priceBigDecimal50java.math.BigDecimal
statusInteger1java.lang.Long

为什么status变成Long?

MyBatis 在 JSON 反序列化(或者参数绑定)时,如果是整数值但没有显式指定类型,很多情况下会用 Long 表示(尤其是 Map 或动态 SQL 场景中)。
ObjectUtil.isNotNull(1L) 本身没问题,但在 OGNL 调用静态方法时,有些版本的 MyBatis/OGNL 会先尝试做类型转换(尤其是如果方法签名有重载或匹配不明确时),于是会触发 "Unable to convert type java.lang.Long to java.lang.CharSequence" 这种异常。

为什么 price 没事?

BigDecimal 类型在 OGNL 里不会被误判去做字符串转换,因为它本来就不是 CharSequence,且 ObjectUtil.isNotNull() 的签名 isNotNull(Object) 匹配得很干脆,没有触发额外的类型推断。

怎么解决?

最稳妥的方式就是 不要用静态方法去判断 null,直接用 OGNL 原生的 null 判断:

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

这样不涉及静态方法匹配,就不会出现 LongCharSequence 的问题。

如果你一定要用 ObjectUtil.isNotNull

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

(Object) 是为了让 OGNL 不去尝试把 Long 当作别的类型匹配。

如果单纯比较性能,原生 != null 判断 会明显比 StrUtil.isNotBlank() 快。

原因很简单:

判断方式逻辑性能分析
!= null直接用 OGNL 判断对象是否为 null,属于一次简单的引用比较O(1) 操作,几乎没有额外开销
StrUtil.isNotBlank()Hutool 工具方法,需要静态方法调用 + 类型检查 + 遍历字符串判断空格至少多了方法调用开销 + 字符遍历(字符串越长耗时越多)

举个例子(粗略对比执行步骤):

1.!= null

  • MyBatis OGNL:取值
  • JVM:引用地址是否为 null → true/false
  • 总耗时 ≈ 一次内存地址比较

2.StrUtil.isNotBlank()

  • MyBatis OGNL:加载 StrUtil
  • JVM:调用静态方法
  • 方法内部:
    • 判断对象是否为 null
    • 调用 String.lenpythongth()
    • 遍历每个字符判断是否为空格字符
  • 总耗时 ≈ 多次方法调用 + 字符遍历

结论

  • 非字符串类型!= null 是最优方案(少步骤、无额外逻辑)
  • 字符串类型 → 如果需要判断空字符串和全空格情况,那必须用 isNotBlank()(功能多,但慢一点)
  • 如果字符串允许空格或空值存储,不做空格判断,用 != null 会快很多

建议:

  • 数值、日期、枚举 → 全部用 != null
  • 字符串 → 如果必须去掉空格判断为空,才用 isNotBlank();否则也用 != null

到此这篇关于MyBatis的XML中字符串类型判空与非字符串类型判空处理方式的文章就介绍到这了,更多相关MyBatis xml字符串类型判空内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155679

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用