当前位置: 首页 > news >正文

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里有没有被逻辑删除条件影响

  • • 有些更新失败,其实是被逻辑删除过滤了

http://www.jsqmd.com/news/267824/

相关文章:

  • Python反爬机制应对从基础到实战,破解网站反爬策略
  • 高效AI摘要与润色工具:九款产品的性能测试与用户体验研究
  • Z-Image-Turbo批量生成避雷指南,别再OOM了
  • 深度解析 2026 托福雅思培训班课程辅导推荐:优质机构口碑排名与提分效果实测 - 老周说教育
  • 2026年影视后期机构怎么选?一家靠谱机构的权威解析 - 华Sir1
  • 国产防脱洗发水前十名榜单最新出炉,控油防脱怎么选?宁山堂获医生认可,控油防脱顶流 - 博客万
  • YOLOv8数据接口异常?API调用问题排查部署案例
  • 九款智能摘要生成平台的性能对比及用户使用体验分析
  • x64dbg处理异常机制深入解析
  • Python 数据分析入门|02:Pandas 数据清洗:缺失值/重复值/异常值处理
  • 白城市洮北通榆镇赉洮南大安英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • 如何快速判断一个域名有没有投资空间
  • YOLO26 epochs设置建议:200轮训练收敛性实测报告
  • 2026小程序开发制作公司盘点:优选国内5家靠谱小程序开发公司 - 品牌2025
  • 2026小程序开发制作公司盘点:优选5家小程序开发公司测评 - 品牌2025
  • 万能场馆预订系统源码,轻松实现数字化转型,拥抱智能化运营新时代
  • python之lession3
  • 2026五年一贯制专转本机构哪家靠谱?真实口碑推荐 - 品牌排行榜
  • 设计模式之单例模式
  • 麦橘超然可不可以换模型?扩展性分析
  • 米诺地尔哪个牌子好?权威评测结果出炉:蔓迪两剂型凭何包揽前二 - 博客万
  • 2026最新电商写字楼租赁推荐!广州优质商务办公空间权威榜单发布,产业聚合与专业服务双优助力企业高效发展 - 品牌推荐2026
  • OpenCV文档扫描仪部署教程:5分钟实现智能扫描
  • 九款高效智能摘要与润色工具的性能评测及用户体验对比
  • 2026年GEO公司招商加盟推荐:招商生态横向对比评测,解决线索低质与转化缓慢痛点 - 十大品牌推荐
  • Qwen2.5多语言支持:英文输出质量与调优实战
  • 金山平台绘就全球发展蓝图 - 博客万
  • 2026国内最新螺丝加工厂家最新top5排行榜发布!广东等地优质组合螺丝/端子螺丝/螺丝定制/螺丝加工公司及供应商综合实力盘点,品质与效率双优助力精密制造. - 品牌推荐2026
  • VHDL在FPGA逻辑设计中的应用:完整指南
  • 成都硕士留学机构口碑排名出炉,学员满意度高受认可 - 留学机构评审官