it编程 > 编程语言 > Java

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

17人参与 2026-01-27 Java

在 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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

SpringBoot接口防抖的5种高效方案

01-27

Java中实现Word和TXT之间互相转换的实用教程

01-27

一文带你搞懂Java中Error和Exception的区别

01-27

SpringBoot + Redis 实现API接口限流的几种方法

01-27

Java中锁分类及在什么场景下使用

01-27

java-jwt 使用小结

01-27

猜你喜欢

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

发表评论