Mybatis-Plus updateById方法更新无效及空值处理过程

 更新时间:2025年07月15日 09:41:18   作者:秋分的秋刀鱼  
MyBatis-Plus的updateById默认不更新null值以防止误操作,可通过UpdateWrapper/LambdaUpdateWrapper显式设置,或全局配置、注解@TableField允许字段更新为空,需根据业务场景选择合适方式

在使用 Mybatis-Plus 进行数据持久化操作时,updateById 方法默认不会更新字段的空值(null)。

这是因为 Mybatis-Plus 为了防止误操作,避免将数据库中原本存在的非空字段更新为 null。然而,在某些业务场景下,我们可能需要允许更新空值。

以下是几种解决 updateById 方法不更新空值或更新字段无效问题的方法:

1. 使用UpdateWrapper并设置setSqlSelect

通过 UpdateWrapper 可以灵活地控制更新的字段,包括允许更新为 null

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;

// 假设有一个实体类 User
User user = new User();
user.setId(1); // 需要更新的记录ID
user.setName(null); // 需要更新为空的字段
user.setAge(30);

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", user.getId())
             .set("name", user.getName()) // 允许 name 字段更新为 null
             .set("age", user.getAge());

int rows = userMapper.update(null, updateWrapper);
System.out.println("受影响的行数: " + rows);

2. 使用LambdaUpdateWrapper并调用set方法

LambdaUpdateWrapper 提供了类型安全的更新方式,同样可以设置字段为 null

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;

User user = new User();
user.setId(1);
user.setName(null); // 需要更新为空的字段
user.setAge(30);

LambdaUpdateWrapper<User> lambdaUpdate = new LambdaUpdateWrapper<>();
lambdaUpdate.eq(User::getId, user.getId())
           .set(User::getName, user.getName()) // 允许 name 字段更新为 null
           .set(User::getAge, user.getAge());

int rows = userMapper.update(null, lambdaUpdate);
System.out.println("受影响的行数: " + rows);

3. 全局配置允许更新空值

如果项目中多处需要更新空值,可以在 Mybatis-Plus 的全局配置中开启 updateStrategy,允许字段更新为 null

mybatis-plus:
  global-config:
    db-config:
      update-strategy: not_null # 默认值,可以设置为 'ignore' 以允许更新 null

或者在代码中进行配置:

import com.baomidou.mybatisplus.annotation.DbConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 其他拦截器配置
        return interceptor;
    }

    @Bean
    public DbConfig dbConfig() {
        return new DbConfig();
    }
}

注意:全局配置会影响所有的更新操作,需谨慎使用。

4. 使用UpdateStrategy注解

在实体类的字段上使用 @TableField 注解,并设置 updateStrategyFieldStrategy.IGNORED,以允许该字段在更新时接受 null 值。

import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;

public class User {
    
    private Long id;
    
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private String name; // 允许更新为 null
    
    private Integer age;

    // getters and setters
}

5. 检查实体类的属性和数据库字段映射

确保实体类中的属性名称与数据库表中的字段名称一致,且类型匹配。

如果存在不一致,可能导致更新无效。

6. 确认事务是否生效

如果在一个事务中进行更新操作,确保事务已正确提交。

未提交的事务不会对数据库产生影响。

import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Transactional
    public void updateUser(User user) {
        userMapper.updateById(user);
    }
}

总结

updateById 方法默认不更新空值是为了防止误操作。

如果确实需要更新空值,可以通过以下几种方式实现:

  1. 使用 UpdateWrapperLambdaUpdateWrapper 并显式设置需要更新的字段为 null
  2. 在全局配置中调整更新策略(需谨慎)。
  3. 在实体类字段上使用注解 @TableField 并设置 updateStrategyIGNORED
  4. 确认实体类与数据库字段的映射关系以及事务的正确性。

根据具体的业务需求选择合适的方法,以确保数据更新操作符合预期。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java编写计算器的常见方法实例总结

    Java编写计算器的常见方法实例总结

    这篇文章主要介绍了Java编写计算器的常见方法,结合实例形式总结分析了Java实现计算器功能的常用方法,需要的朋友可以参考下
    2016-04-04
  • Junit 5中@ParameterizedTest与@EnumSource结合使用

    Junit 5中@ParameterizedTest与@EnumSource结合使用

    今天小编就为大家分享一篇关于Junit 5中@ParameterizedTest与@EnumSource结合使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java开发中的常见常用算法详解

    Java开发中的常见常用算法详解

    在Java编程中掌握常用的算法对于高效解决问题至关重要,下面这篇文章主要介绍了Java开发中常见常用算法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • Java Bluetooth 蓝牙通讯 BlueCove 扫描附近的蓝牙设备(测试代码)

    Java Bluetooth 蓝牙通讯 BlueCove 扫描附近的蓝牙设备(测试代码)

    BlueCove是一个开源的蓝牙协议栈实现,旨在为Java开发者提供一个全面的、易于使用的API,从而在应用程序中实现蓝牙功能,该项目支持多种操作系统,这篇文章主要介绍了Java Bluetooth 蓝牙通讯 BlueCove 扫描附近的蓝牙设备,需要的朋友可以参考下
    2025-01-01
  • 如何在IDEA Maven项目中导入本地jar包的步骤

    如何在IDEA Maven项目中导入本地jar包的步骤

    今天小编就为大家分享一篇关于IDEA Maven项目中导入本地jar包的步骤,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • springboot返回html和jsp的方法示例

    springboot返回html和jsp的方法示例

    这篇文章主要介绍了springboot返回html和jsp的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java由浅入深通关抽象类与接口上

    Java由浅入深通关抽象类与接口上

    在类中没有包含足够的信息来描绘一个具体的对象,这样的类称为抽象类,接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成,本文给大家介绍Java抽象类和接口,感兴趣的朋友一起看看吧
    2022-04-04
  • druid return行为方法源码示例解析

    druid return行为方法源码示例解析

    这篇文章主要为大家介绍了druid return行为源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 记一次线上SpringCloud Feign请求服务超时异常排查问题

    记一次线上SpringCloud Feign请求服务超时异常排查问题

    这篇文章主要介绍了记一次线上SpringCloud Feign请求服务超时异常排查问题,本项目与下游项目均注册在Eureka上面,对这个1秒就超时感到很迷惑,于是开始查阅底层源码之旅。需要的朋友可以参考下
    2022-01-01
  • 全网最新Log4j 漏洞修复和临时补救方法

    全网最新Log4j 漏洞修复和临时补救方法

    Apache Log4j 远程代码执行漏洞,如何快速修复log4j2漏洞,本文给大家介绍下Log4j 漏洞修复和临时补救方法,感兴趣的朋友跟随小编一起看看吧
    2021-12-12

最新评论