当前位置: 首页 > article >正文

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

在使用 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. 确认实体类与数据库字段的映射关系以及事务的正确性。

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


http://www.kler.cn/a/456136.html

相关文章:

  • pyqt和pycharm环境搭建
  • 嵌入式AI STM32部署卷积神经网络的魔法棒
  • 条款19 对共享资源使用std::shared_ptr
  • 使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径
  • blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质
  • Apache Commons Pool2—Java对象池的利器
  • 【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
  • mprpc框架代码详解
  • 【HarmonyOS之旅】ArkTS语法(二)->动态构建UI元素
  • Spring Boot介绍、入门案例、环境准备、POM文件解读
  • UE(虚幻)学习(一) UE5.3.2和VS2022的安装以及遇到的问题和一些CS8604、CA2017报错问题.
  • HIVE数据仓库分层
  • 华为麦芒5(安卓6)termux记录 使用ddns-go,alist
  • 部分背包问题
  • 504 Gateway Time-out nginx如何处理
  • dell g7重装系统后无法识别耳机
  • springboot503基于Sringboot+Vue个人驾校预约管理系统(论文+源码)_kaic
  • Visual Studio 2022 QT5.14.2 环境下缺少pro文件以及QT库或模块的引用问题
  • 【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块
  • LabVIEW生物发酵远程在线监控
  • ORB-SLAM2源码学习:System.cc: System::TrackStereo、TrackRGBD、TrackMonocular追踪器接口
  • 《中国旅游报》投稿指南
  • Java测试开发平台搭建(六)持久化之mybatis配置
  • 路由反射器
  • 强化学习寻宝游戏
  • C#使用Tesseract C++ API过程记录