当前位置: 代码网 > it编程>编程语言>Java > MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

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

2025年08月11日 Java 我要评论
orderno != null 这种非字符串类型的判断,也能用 java 静态方法来替代,比如用 hutool 的 objectutil.isnotnull() 或 objectutil.isnote

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="orderno != null">...</if>

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

现在 hutool 写法

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

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

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

这个现象其实是 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 反序列化(或者参数绑定)时,如果是整数值但没有显式指定类型,很多情况下会用 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.length()
    • 遍历每个字符判断是否为空格字符
  • 总耗时 ≈ 多次方法调用 + 字符遍历

结论

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

建议:

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

到此这篇关于mybatis的xml中字符串类型判空与非字符串类型判空处理方式的文章就介绍到这了,更多相关mybatis xml字符串类型判空内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com