17人参与 • 2026-01-27 • Java
在 mybatis-plus 里,更新 null 字段是一个非常常见、也非常容易踩坑的问题。
很多人会遇到这种情况:
我明明 setxxx(null) 了,为什么数据库里还是原来的值?
下面我按 原因 → 解决方案 → 使用建议 来整理一下。
这是 mybatis-plus 的设计行为,不是 bug。
默认情况下:
@tablefield(updatestrategy = fieldstrategy.not_null)
也就是说:
字段为
null,就不会出现在 update 语句里
目的是为了:
null所以你写:
user user = new user(); user.setid(1l); user.setemail(null); usermapper.updatebyid(user);
实际生成的 sql 类似:
update user set id = ? where id = ?
email 根本没参与更新。
@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<user> wrapper = new updatewrapper<>();
wrapper.eq("id", 1l)
.set("email", null);
usermapper.update(null, wrapper);
生成 sql:
update user set email = null where id = ?
适合场景
lambdaupdatewrapper<user> wrapper = wrappers.lambdaupdate(); wrapper.eq(user::getid, 1l) .set(user::getemail, null); usermapper.update(null, wrapper);
类型安全、ide 友好,实际项目更推荐
逻辑删除字段 + 更新 null
如果你用了:
@tablelogic private integer deleted;
一定要确认:
wrapper 里有没有被逻辑删除条件影响到此这篇关于mybatis-plus 默认不更新null的4种方法的文章就介绍到这了,更多相关mybatis-plus 默认不更新null内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论