Mybatis-Plus 解决 updateById 更新 null 值无效问题
在使用 Mybatis-Plus 进行数据更新时,若实体字段值为 null,默认策略下数据库不会变更该字段。本文详解通过配置全局 field-strategy 或在实体类字段上使用 @TableField(strategy = FieldStrategy.IGNORED) 注解,强制更新 null 值,解决前端清空字段后后端无法同步的问题。
问题现象:updateById 更新 null 值失效
在前端开发中,用户修改数据时可能会删除某些属性内容。此时前端通常会将该字段设置为 null 提交给后端。然而,当后端接收该对象并调用 updateById()
具体场景如下:
- 原始数据中
name为"tt"。 - 前端页面删除该属性,向后端发送
{ name: null }。 - 后端接收参数
name: null。 - 调用
updateById(entity)执行更新。 - 结果:数据库中
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。这是最安全且精确的控制方式。
操作步骤:
- 定位实体类:找到需要支持 null 更新的 Java 实体类文件。
- 添加注解:在目标字段上方添加
@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 更新策略的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













