news 2026/8/25 7:11:10

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/8/24 10:57:32

cy5.5-Fructose-6-phosphate,cy5.5-果糖-6-磷酸

Cy5.5-Fructose-6-phosphate&#xff08;Cy5.5-果糖-6-磷酸&#xff09;是由荧光染料Cy5.5与生物分子**果糖-6-磷酸&#xff08;Fru-6-P&#xff09;**偶联形成的化合物。果糖-6-磷酸是糖酵解途径中的重要中间产物&#xff0c;广泛参与细胞内的能量代谢过程。Cy5.5作为一种深红…

作者头像 李华
网站建设 2026/8/22 23:12:36

从千元到近亿,“死了么”App为何刷爆全网?

2026 年刚开局&#xff0c;互联网就被一个名字不太吉利的 APP 刷了屏——“死了么”&#xff08;1 月 13 日官方公布其后续将启用全球化品牌名 Demumu&#xff09;。没有算法加持&#xff0c;没有 AI 炫技&#xff0c;甚至没有花一分钱推广&#xff0c;这个功能简单到近乎简陋的…

作者头像 李华
网站建设 2026/8/19 11:56:49

Scrapy LinkExtractor参数详解与复杂链接提取

Scrapy 作为 Python 生态中最强大的爬虫框架之一&#xff0c;其链接提取功能是实现深度爬取、整站爬取的核心基础。LinkExtractor&#xff08;位于scrapy.linkextractors import LinkExtractor&#xff09;是 Scrapy 提供的专门用于提取页面中链接的工具类&#xff0c;它封装了…

作者头像 李华
网站建设 2026/8/22 22:20:25

基于STM32智能出租车计价器分时计费设计60X(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于STM32智能出租车计价器分时计费设计60X(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、1.44寸TFT彩屏、电机驱动电路、霍尔传感器、蜂鸣器报警、按键电路及电…

作者头像 李华
网站建设 2026/8/21 20:06:58

、STM32智能交流电压电流+有功功率+功率因数+频率+无功功率+视在功率(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

24-035、STM32智能交流电压电流有功功率功率因数频率无功功率视在功率(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码产品功能描述&#xff1a; 本设计由STM32F103C8T6单片机核心板无线模块可选TFT1.44寸液晶屏交流采集模块组…

作者头像 李华