MyBatis-Plus解决字段不更新为null的六大解决方案

 更新时间:2026年01月05日 09:41:32   作者:阿萨德528号  
MyBatis-Plus 默认情况下不会将字段更新为 null,这是出于防止误操作的考虑,本文为大家整理了6个解决方法,大家可以根据自己的需求进行选择

MyBatis-Plus 默认情况下不会将字段更新为 null,这是出于防止误操作的考虑。以下是几种解决方案:

1.使用 UpdateWrapper(推荐)

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("name", null)
            .set("age", null)
            .eq("id", 1);

userMapper.update(null, updateWrapper); // null表示不使用实体类传递参数

2.使用 LambdaUpdateWrapper(类型安全)

LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(User::getName, null)
            .set(User::getAge, null)
            .eq(User::getId, 1);

userMapper.update(null, updateWrapper); // null表示不使用实体类传递参数

3.实体类 + 字段策略配置(全局/局部)

全局配置(在配置文件中)

mybatis-plus:
  global-config:
    db-config:
      # 忽略null值字段,这里设置为false才会更新null值
      update-strategy: ignored
      # 可选值: 
      # ignored: 忽略null值(默认)
      # not_null: 只更新非null值
      # not_empty: 只更新非空值

局部配置(在字段上使用注解)

public class User {
    @TableField(strategy = FieldStrategy.IGNORED)  // 总是更新,包括null
    private String name;
    
    @TableField(updateStrategy = FieldStrategy.IGNORED)  // 仅更新时忽略策略
    private Integer age;
}

FieldStrategy 选项:

  • IGNORED:忽略判断,总是更新(包括null)
  • NOT_NULL:非 NULL 判断(默认)
  • NOT_EMPTY:非空判断(字符串额外检查空串)
  • NEVER:不加入SQL

4.使用insertOrUpdate方法

User user = new User();
user.setId(1L);
user.setName(null);  // 需要结合字段策略配置

userMapper.insertOrUpdate(user);

5.自定义 SQL(复杂情况)

// 在 Mapper 接口中
@Update("UPDATE user SET name = null WHERE id = #{id}")
int updateNameToNull(@Param("id") Long id);

6.使用alwaysUpdateSomeColumnById方法(插件方式)

添加插件配置:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new AlwaysUpdateSomeColumnByIdInnerInterceptor());
    return interceptor;
}

最佳实践建议

场景1:偶尔需要更新为null

// 使用 UpdateWrapper,不需要修改实体类注解
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.set("email", null)
      .eq("id", userId);
userMapper.update(null, wrapper);

场景2:特定字段经常需要更新为null

// 在实体类字段上添加注解
public class User {
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private String nickname;  // 该字段可以更新为null
}

场景3:批量更新为null

List<Long> ids = Arrays.asList(1L, 2L, 3L);
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(User::getAvatar, null)
      .in(User::getId, ids);
userMapper.update(null, wrapper);

注意事项

  • 性能考虑FieldStrategy.IGNORED 会使该字段在所有更新操作中都参与SQL生成
  • 数据安全:谨慎使用全局配置,防止误操作
  • 推荐做法:需要更新为null的字段使用注解,其他字段保持默认
  • 版本兼容:不同版本的MyBatis-Plus可能有不同的策略名称

常见问题

Q:为什么设置了null但数据库没更新?

A:检查字段是否使用了 @TableField(updateStrategy = NOT_NULL)(默认策略)

Q:如何让某个字段插入时可以为null,更新时不为null?

@TableField(insertStrategy = FieldStrategy.IGNORED, 
            updateStrategy = FieldStrategy.NOT_NULL)
private String phone;

Q:更新部分字段为null,部分字段保持原值?

User user = new User();
user.setId(1L);
user.setName(null);

LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(User::getName, null)      // 更新为null
      .set(User::getAge, user.getAge()) // 保持原值
      .eq(User::getId, user.getId());
userMapper.update(null, wrapper);

建议

根据具体场景选择合适的方法,一般推荐使用 UpdateWrapper 方式,因为它最灵活且不会影响其他操作的默认行为。

// ❌ 错误:实体对象无法设置null值(默认策略会忽略null)
User user = new User();
user.setId(1L);
user.setName(null);  // 这个null会被忽略,不会更新到数据库

UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 1);

userMapper.update(user, wrapper);  // name不会被更新为null

// ✅ 正确:使用wrapper.set()可以更新为null
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.set("name", null)  // 明确设置null值
      .eq("id", 1);

userMapper.update(null, wrapper);  // name会被更新为NULL

到此这篇关于MyBatis-Plus解决字段不更新为null的六大解决方案的文章就介绍到这了,更多相关MyBatis Plus更新字段为null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javaWEB实现相册管理的简单功能

    javaWEB实现相册管理的简单功能

    这篇文章主要介绍了javaWEB实现相册管理的简单功能,包括图片的上传、统一浏览、单个下载、单个删除,还有一个功能只能删除自己上传的文件,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • SpringBoot整合Quartz实现动态配置的代码示例

    SpringBoot整合Quartz实现动态配置的代码示例

    这篇文章将介绍如何把Quartz定时任务做成接口,实现以下功能的动态配置添加任务,修改任务,暂停任务,恢复任务,删除任务,任务列表,任务详情,文章通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • java安全编码指南之:对象构建操作

    java安全编码指南之:对象构建操作

    这篇文章主要介绍了java安全编码指南之:对象构建操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java分析html算法(java网页蜘蛛算法示例)

    java分析html算法(java网页蜘蛛算法示例)

    近来有些朋友在做蜘蛛算法,或者在网页上面做深度的数据挖掘,下面使用示例
    2014-03-03
  • 深度解析@JsonSerialize注解及其在Jackson 序列化中的应用小结

    深度解析@JsonSerialize注解及其在Jackson 序列化中的应用小结

    本文详细介绍了Jackson库中的@JsonSerialize注解,探讨其用途、优点、缺点以及在日期格式处理、特殊数据类型、敏感信息隐藏和自定义逻辑等场景的应用,通过实例演示了如何在Person类中使用注解定制日期序列化,感兴趣的朋友一起看看吧
    2025-10-10
  • 多线程计数,怎么保持计数准确的方法

    多线程计数,怎么保持计数准确的方法

    这篇文章主要介绍了多线程计数的方法,有需要的朋友可以参考一下
    2014-01-01
  • SpringMVC HttpMessageConverter消息转换器

    SpringMVC HttpMessageConverter消息转换器

    ​​HttpMessageConverter​​​,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文。​​​HttpMessageConverter​​​提供了两个注解和两个类型:​​@RequestBody,@ResponseBody​​​,​​RequestEntity,ResponseEntity​​
    2023-04-04
  • Java CAS底层实现原理实例详解

    Java CAS底层实现原理实例详解

    这篇文章主要介绍了Java CAS底层实现原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • SpringCloud Eureka实现服务注册与发现

    SpringCloud Eureka实现服务注册与发现

    Eureka是一种基于REST(具像状态传输)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移。本文记录一个简单的服务注册与发现实例。感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 解决使用json-lib包实现xml转json时空值被转为空中括号的问题

    解决使用json-lib包实现xml转json时空值被转为空中括号的问题

    网上能查到的xml转json的jar包大部分是net.sf.json-lib,但是JSON json =xmlSerializer.read(xml); 方法会出现将空值转化为[]的问题,下面为大家提供两种解决方法
    2018-03-03

最新评论