java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis-Plus 默认不更新null

MyBatis-Plus 默认不更新null的4种方法

作者:马卡巴卡

本文主要介绍了MyBatis-Plus 默认不更新null的4种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 MyBatis-Plus 里,更新 null 字段是一个非常常见、也非常容易踩坑的问题。
很多人会遇到这种情况:

我明明 setXxx(null) 了,为什么数据库里还是原来的值?

下面我按 原因 → 解决方案 → 使用建议 来整理一下。

一、为什么 MyBatis-Plus 默认不更新 null?

这是 MyBatis-Plus 的设计行为,不是 bug。

默认情况下:

@TableField(updateStrategy = FieldStrategy.NOT_NULL)

也就是说:

字段为 null,就不会出现在 UPDATE 语句里

目的是为了:

所以你写:

User user = new User();
user.setId(1L);
user.setEmail(null);

userMapper.updateById(user);

实际生成的 SQL 类似:

UPDATE user SET id = ? WHERE id = ?

email 根本没参与更新。

二、更新 null 的几种正确方式(重点)

方式一:使用@TableField(updateStrategy = FieldStrategy.IGNORED)(最推荐)

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

含义是:

不管是不是 null,都参与 update

这时:

user.setEmail(null);
userMapper.updateById(user);

生成 SQL:

UPDATE user SET email = NULL WHERE id = ?

适合场景

方式二:在实体类级别统一策略

@TableName(value = "user", autoResultMap = true)
public class User {
}

配合全局配置(不太常用,可以了解):

mybatis-plus:
  global-config:
    db-config:
      update-strategy: ignored

慎用

方式三:使用UpdateWrapper(最灵活)

如果你不想改实体类:

UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 1L)
       .set("email", null);

userMapper.update(null, wrapper);

生成 SQL:

UPDATE user SET email = NULL WHERE id = ?

适合场景

方式四:使用LambdaUpdateWrapper

LambdaUpdateWrapper<User> wrapper = Wrappers.lambdaUpdate();
wrapper.eq(User::getId, 1L)
       .set(User::getEmail, null);

userMapper.update(null, wrapper);

类型安全、IDE 友好,实际项目更推荐

三、一个容易忽略的坑

逻辑删除字段 + 更新 null

如果你用了:

@TableLogic
private Integer deleted;

一定要确认:

到此这篇关于MyBatis-Plus 默认不更新null的4种方法的文章就介绍到这了,更多相关MyBatis-Plus 默认不更新null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文