MyBatis-Plus 默认不更新null的4种方法
在 MyBatis-Plus 里,更新 null 字段是一个非常常见、也非常容易踩坑的问题。
很多人会遇到这种情况:
我明明 setXxx(null) 了,为什么数据库里还是原来的值?
下面我按 原因 → 解决方案 → 使用建议 来整理一下。
一、为什么 MyBatis-Plus 默认不更新 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 根本没参与更新。
二、更新 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
慎用
- • 会导致所有字段都能被更新为 null
- • 风险较大,不适合复杂业务
方式三:使用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 = ?
适合场景
- • 后台管理
- • 批量操作
- • 精准控制 SQL
方式四:使用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;
一定要确认:
Wrapper里有没有被逻辑删除条件影响- 有些更新失败,其实是 被逻辑删除过滤了
到此这篇关于MyBatis-Plus 默认不更新null的4种方法的文章就介绍到这了,更多相关MyBatis-Plus 默认不更新null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
File.createTempFile创建临时文件的示例详解
这篇文章主要介绍了File.createTempFile创建临时文件的示例详解,在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 如果感兴趣来了解一下2020-07-07
SpringBoot+WebMagic实现网页爬虫的示例代码
本文是对spring boot+WebMagic+MyBatis做了整合,使用WebMagic爬取数据,然后通过MyBatis持久化爬取的数据到mysql数据库,具有一定的参考价值,感兴趣的可以了解一下2023-10-10


最新评论