news 2026/6/10 13:40:44

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/6/10 8:59:03

12.2 视频生成新突破:Veo3、Make-A-Video技术解析

12.2 视频生成新突破:Veo3、Make-A-Video技术解析 在上一节中,我们探讨了2025年多模态技术的三大发展方向。本节将深入分析视频生成领域的最新突破,特别是Veo3和Make-A-Video等前沿技术。视频生成作为多模态AI的重要应用领域,近年来取得了显著进展,为内容创作、娱乐、教育…

作者头像 李华
网站建设 2026/6/10 9:19:42

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

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

作者头像 李华
网站建设 2026/6/10 10:20:28

vue3-python县志捐赠与借阅信息管理系统的设计与实现16069432

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 该系统基于Vue3和Python技术栈&#xff0c;设计并实现了一个县志捐赠与借阅信息管理平台&#xff0c;旨在解决传统县志管理中效…

作者头像 李华
网站建设 2026/6/10 10:39:06

STM32单片机心率血氧血压温度检测082X(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

STM32单片机心率血氧血压温度检测082X(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、TFT1.44寸彩屏液晶显示电路、XGZP6847A血压检测电路、MAX30102血氧心率检测…

作者头像 李华
网站建设 2026/6/10 10:41:35

东方博宜OJ 2379:最少交通费 ← 堆优化 Dijkstra + 链式前向星

【题目来源】 https://oj.czos.cn/p/2379 https://www.acwing.com/problem/content/852/ 【题目描述】 Mar 星球上共有 n 个城市&#xff08;编号为 1~n&#xff09;&#xff0c;城市之间为了方便交通修建了 m 条单向高速公路。 有些公路是为了交通方便连接了 2 个不同的城市&…

作者头像 李华