news 2026/9/28 16:22:34

MyBatis-Plus 默认不更新 null?这 4 种方法帮你搞定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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里有没有被逻辑删除条件影响

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 9:25:28

11.3 多模态游戏AI:构建视觉感知的智能体

11.3 多模态游戏AI:构建视觉感知的智能体 在前面两节中,我们探讨了具身智能的基础知识以及强化学习算法(PPO和SAC)。本节我们将关注一个多模态AI的重要应用场景——游戏AI,特别是那些依赖视觉感知的智能体。游戏环境为测试和发展AI系统提供了理想的实验平台,因为它包含了…

作者头像 李华
网站建设 2026/9/27 18:53:11

【Linux命令大全】006.网络通讯之cu命令(实操篇)

【Linux命令大全】006.网络通讯之cu命令&#xff08;实操篇&#xff09; ✨ 本文为Linux系统网络通讯命令的全面汇总与深度优化&#xff0c;结合图标、结构化排版与实用技巧&#xff0c;专为高级用户和系统管理员打造。 (关注不迷路哈&#xff01;&#xff01;&#xff01;) 文…

作者头像 李华
网站建设 2026/9/27 8:05:28

数控机床待机时间与能耗数据采集解决方案

随着制造业数字化转型与节能降耗要求的不断提升&#xff0c;数控机床的运行效率与能源管理水平日益成为企业关注的重点。传统管理方式依赖人工记录与经验判断&#xff0c;难以准确获取机床实时状态与能耗数据&#xff0c;导致设备利用率低、能源浪费严重、运维决策缺乏数据支持…

作者头像 李华
网站建设 2026/9/27 18:33:41

基于51单片机智能电表插座交流电压流Proteus仿真资料设计24-392(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于51单片机智能电表插座交流电压流Proteus仿真资料设计24-392(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码24-392、51单片机智能电表插座交流电压流检测阈值报警-Proteus仿真设计 产品功能描述&#xff1a; 本系统由STC89…

作者头像 李华