MyBatis-Plus 默认不更新null的4种方法

 更新时间:2026年01月27日 09:56:29   作者:马卡巴卡  
本文主要介绍了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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现抖音飞机大作战

    java实现抖音飞机大作战

    这篇文章主要为大家详细介绍了java实现抖音飞机大作战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 工作中禁止使用Executors快捷创建线程池原理详解

    工作中禁止使用Executors快捷创建线程池原理详解

    这篇文章主要为大家介绍了工作中禁止使用Executors快捷创建线程池原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • File.createTempFile创建临时文件的示例详解

    File.createTempFile创建临时文件的示例详解

    这篇文章主要介绍了File.createTempFile创建临时文件的示例详解,在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 如果感兴趣来了解一下
    2020-07-07
  • SpringBoot+WebMagic实现网页爬虫的示例代码

    SpringBoot+WebMagic实现网页爬虫的示例代码

    本文是对spring boot+WebMagic+MyBatis做了整合,使用WebMagic爬取数据,然后通过MyBatis持久化爬取的数据到mysql数据库,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • java设计模式--三种工厂模式详解

    java设计模式--三种工厂模式详解

    这篇文章主要为大家详细介绍了Java设计模式之工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-07-07
  • 基于springboot实现文件上传

    基于springboot实现文件上传

    这篇文章主要为大家详细介绍了基于springboot实现文件上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 关于jar包增量更新分析

    关于jar包增量更新分析

    这篇文章主要介绍了关于jar包增量更新分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java打乱数组元素简单代码例子

    Java打乱数组元素简单代码例子

    在Java编程中,我们经常需要对数组进行乱序操作(即将数组中的元素随机打乱顺序),这篇文章主要给大家介绍了关于Java打乱数组元素的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • SpringBoot分布式文件存储数据库mongod

    SpringBoot分布式文件存储数据库mongod

    MongoDB是一个基于分布式文件存储的NoSQL数据库,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富最像关系数据库的
    2023-02-02
  • 基于Java实现本地APK文件搜索与HTTP下载服务

    基于Java实现本地APK文件搜索与HTTP下载服务

    在移动应用开发和测试过程中,经常需要从本地服务器获取最新的 APK 安装包,本文将详细介绍如何使用 Java 构建一个能够搜索本地最新 APK 文件并通过 HTTP 请求提供下载服务的应用
    2025-07-07

最新评论