Mybatis-Plus 解决 updateById 更新 null 值无效问题

Chloe
Chloe
发布时间:2026-10-13 | 2人浏览过
原创

在使用 Mybatis-Plus 进行数据更新时,若实体字段值为 null,默认策略下数据库不会变更该字段。本文详解通过配置全局 field-strategy 或在实体类字段上使用 @TableField(strategy = FieldStrategy.IGNORED) 注解,强制更新 null 值,解决前端清空字段后后端无法同步的问题。

问题现象:updateById 更新 null 值失效

在前端开发中,用户修改数据时可能会删除某些属性内容。此时前端通常会将该字段设置为 null 提交给后端。然而,当后端接收该对象并调用 updateById()

具体场景如下:

  1. 原始数据中 name 为 "tt"。
  2. 前端页面删除该属性,向后端发送 { name: null }。
  3. 后端接收参数 name: null。
  4. 调用 updateById(entity) 执行更新。
  5. 结果:数据库中 name 字段依然为 "tt",未被更新为空或 null。

原因分析:Mybatis-Plus 的 FieldStrategy 机制

Mybatis-Plus 为了简化 SQL 编写,默认提供了三种字段更新策略(FieldStrategy)。在默认的 NOT_NULL 策略下,框架在生成 UPDATE 语句时会忽略所有值为 null 的字段,以防止意外覆盖数据库中的原有数据。

FieldStrategy 包含以下三种枚举值:

  • IGNORED:忽略判断,无论字段是否为空都参与更新。
  • NOT_NULL:非 NULL 检查,默认策略。仅当字段不为 null 时才生成对应的 SQL 列更新操作。
  • NOT_EMPTY:非空检查。不仅要求字段不为 null,还要求字符串等类型不为空字符串,才参与更新。
public enum FieldStrategy {
    IGNORED,//参数为空也更新到数据库
    NOT_NULL,//参数不能为null,默认策略
    NOT_EMPTY;//参数不能为空
}

解决方案一:全局配置 field-strategy

如果项目中存在大量需要更新 null 值的场景,可以通过全局配置文件统一设置策略,避免在每个字段上重复添加注解。将全局策略调整为 IGNORED,即可让所有未特殊标注的字段在值为 null 时也能更新。

在全局配置中添加如下参数:

注意风险:此方法会将影响所有实体的更新行为。对于某些不应被覆盖的业务字段(如创建时间、状态码等),可能导致意外更改。建议在明确业务逻辑允许的情况下使用,或配合局部注解进行精细化控制。

解决方案二:局部注解指定策略

若只想针对特定字段允许更新 null 值,推荐在实体类的对应字段上添加 @TableField 注解,并显式指定 strategy = FieldStrategy.IGNORED。这是最安全且精确的控制方式。

操作步骤:

  1. 定位实体类:找到需要支持 null 更新的 Java 实体类文件。
  2. 添加注解:在目标字段上方添加 @TableField(strategy = FieldStrategy.IGNORED)。同时可配合 value 属性指定数据库列名(若列名与字段名不一致)。

代码示例:

@Data
public class UserEntity {
    private Long id;

    // 指定该字段即使为 null 也会更新到数据库
    @TableField(strategy = FieldStrategy.IGNORED, value="name")
    private String name;
    
    // 其他字段保持默认策略(NOT_NULL)
    private String email;
}

经过上述配置后,再次调用 updateById(),带有 IGNORED 策略的 name 字段即使是 null,也会正常生成 SQL 并更新到数据库中。

总结

Mybatis-Plus 默认忽略 null 值的更新行为是为了保护数据安全,但在处理前端“清空字段”等特定需求时会造成困扰。开发者应根据实际业务场景,选择全局配置 field-strategy=IGNORED 或在关键实体字段上使用 @TableField(strategy = FieldStrategy.IGNORED) 来解决问题。局部注解的方式更具备灵活性和安全性,推荐在多数场景下使用。

以上就是 Mybatis-Plus 解决 updateById 更新 null 值无效问题的详细内容,更多关于 Mybatis-Plus 更新策略的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表