mybatis-plus 对于属性为null字段不更新

MyBatis-Plus 默认情况下会根据字段的值是否为 null 来决定是否生成对应的 UPDATE 语句。这是由 更新策略 决定的,默认的行为是 忽略 null 值,即如果字段值为 null,该字段将不会出现在 UPDATE 语句中。

默认行为分析

MyBatis-Plus 默认的 FieldStrategy 配置如下:

java 复制代码
FieldStrategy.NOT_NULL(默认):

当字段值为 null 时,UPDATE 语句中会忽略该字段。

这是为了避免不必要地将字段更新为 null,从而减少对现有数据的意外影响。

java 复制代码
FieldStrategy.IGNORED:

忽略字段值是否为 null,即使为 null 也会生成对应的 UPDATE 语句。

java 复制代码
FieldStrategy.NOT_EMPTY:

对于字符串,只有当字段值非空(!= "")时,才会生成 UPDATE 语句;对于其他类型,行为类似于 NOT_NULL。

如何更新 null 值

如果需要更新字段为 null,有以下几种解决方法:

  1. 针对字段设置 FieldStrategy.IGNORED
    在实体类的字段上,使用 @TableField 注解并指定 updateStrategy 为
java 复制代码
FieldStrategy.IGNORED:

@TableField(updateStrategy = FieldStrategy.IGNORED)
private String facilities;

这样即使 facilities 为 null,UPDATE 语句中也会包含它。

  1. 修改全局更新策略
    如果你希望全局都允许 null 值更新,可以在 MyBatis-Plus 配置中调整全局 update-
java 复制代码
strategy:
application.yml:
mybatis-plus:
  global-config:
    db-config:
      update-strategy: ignored

这会使所有字段在更新时忽略值是否为 null。

  1. 使用手动 SQL 强制更新
    可以直接在 Mapper 接口中编写手动 SQL,确保字段被强制更新:
    @Update("UPDATE cm_ci_em_info SET facilities = #{facilities} WHERE id = #{id}")
    void updateFacilities(@Param("id") String id, @Param("facilities") String facilities);

这种方式可以完全控制 UPDATE 语句的生成逻辑。

  1. 使用动态 SQL
    如果需要更精细地控制更新逻辑,可以在 Mapper 的 XML 文件中使用动态 SQL。例如:
java 复制代码
<update id="updateById">
    UPDATE cm_ci_em_info
    <set>
        <if test="facilities != null">
            facilities = #{facilities},
        </if>
        <if test="facilities == null">
            facilities = NULL,
        </if>
    </set>
    WHERE id = #{id}
</update>

示例对比

实体字段为 null 的更新效果

以下是 FieldStrategy 的不同配置对应的 SQL 行为:

默认 NOT_NULL(默认策略):

实体 facilities = null:

java 复制代码
UPDATE cm_ci_em_info SET model_id = ? WHERE id = ?

FieldStrategy.IGNORED(忽略 null 检查):

实体 facilities = null:

java 复制代码
UPDATE cm_ci_em_info SET facilities = NULL, model_id = ? WHERE id = ?

总结

默认情况下,MyBatis-Plus 会忽略值为 null 的字段,不生成 UPDATE 语句。如果你需要更新字段为 null:

对字段单独配置 @TableField(updateStrategy = FieldStrategy.IGNORED)。

修改全局策略 update-strategy 为 ignored。

编写手动 SQL 强制更新。

使用动态 SQL 明确处理 null 值的更新逻辑

相关推荐
nice_lcj52018 分钟前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist
微小的鱼29 分钟前
Linux的渲染与显示系统链路
android·java·linux
若亦_1 小时前
Java中关于this的三种用法
java·开发语言·intellij-idea
山甫aa1 小时前
锁一篇搞定:乐观锁、悲观锁、CAS、数据库锁与分布式锁【从零开始的 Web 后端学习】
java·数据库·分布式·后端·学习·web
软件技术NINI1 小时前
基于SpringBoot和Vue的博物馆预约平台管理系统的设计与实现
java·毕业设计·毕设
独泪了无痕11 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南12 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
kingx313 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
DevOpenClub15 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
露天赏雪16 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel