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

saveOrUpdate 有个缺点,不会把值赋值为null,解决办法

针对 MyBatis-Plus 的 saveOrUpdate 方法无法将字段更新为 null 的问题,这是因为 MyBatis-Plus 默认会忽略 null 值字段。以下是几种解决方案:

方案 1:使用 update(entity, wrapper) 手动指定更新条件

原理:通过 UpdateWrapper 明确指定需要更新为 null 的字段。

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {public void updateWithNullValue() {User user = new User();user.setId(1L);user.setUsername(null); // 需要更新为 null 的字段// 手动构建 UpdateWrapper,强制更新 null 值字段UpdateWrapper<User> wrapper = new UpdateWrapper<>();wrapper.set("username", null) // 指定 username 字段更新为 null.eq("id", user.getId()); // 更新条件:ID = 1// 调用 update 方法,第一个参数可以为 null(因为条件已在 wrapper 中)boolean success = this.update(null, wrapper);if (success) {System.out.println("更新 null 值成功");}}
}

方案 2:配置全局字段策略(推荐)

原理:通过配置 FieldStrategy 让 MyBatis-Plus 不忽略 null 值。

方式 1:配置文件(application.yml)
mybatis-plus:global-config:db-config:update-strategy: IGNORED  # 更新策略:忽略判断,所有字段都更新(包括 null)
方式 2:Java 配置类
@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 其他配置...// 配置全局策略GlobalConfig globalConfig = new GlobalConfig();GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();dbConfig.setUpdateStrategy(FieldStrategy.IGNORED); // 更新时忽略字段非空判断globalConfig.setDbConfig(dbConfig);return interceptor;}
}

方案 3:使用 @TableField 注解(细粒度控制)

原理:在实体类字段上指定更新策略为 IGNORED

@Data
@TableName("t_user")
public class User {@TableIdprivate Long id;@TableField(updateStrategy = FieldStrategy.IGNORED) // 该字段更新时忽略 null 判断private String username;private String phone;@TableField(updateStrategy = FieldStrategy.IGNORED) // 该字段更新时忽略 null 判断private Integer age;
}

方案 4:自定义 SQL 方法

原理:在 Mapper 接口中自定义更新方法,使用 @Update 注解编写 SQL。

public interface UserMapper extends BaseMapper<User> {@Update("UPDATE t_user SET username = #{username}, age = #{age} WHERE id = #{id}")boolean updateWithNull(@Param("id") Long id, @Param("username") String username, @Param("age") Integer age);
}

Service 层调用

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {public void customUpdateWithNull() {boolean success = baseMapper.updateWithNull(1L, null, 25);if (success) {System.out.println("自定义 SQL 更新 null 值成功");}}
}

总结

方案优点缺点适用场景
方案 1灵活,按需更新代码冗余少量需要更新 null 的场景
方案 2全局生效,无需修改代码影响所有实体项目中大量需要更新 null
方案 3细粒度控制,不影响其他字段需修改实体类部分字段需要更新 null
方案 4完全自定义 SQL维护成本高复杂更新逻辑或性能敏感场景

推荐顺序:方案 3(细粒度控制)→ 方案 2(全局配置)→ 方案 1(临时需求)→ 方案 4(特殊场景)。

http://www.lryc.cn/news/2398439.html

相关文章:

  • Java面试:企业协同SaaS中的技术挑战与解决方案
  • 【笔记】在 MSYS2 MINGW64 环境中降级 NumPy 2.2.6 到 2.2.4
  • 前端限流如何实现,如何防止服务器过载
  • 基于大模型的慢性硬脑膜下血肿预测与诊疗系统技术方案
  • vue入门环境搭建及demo运行
  • git checkout C1解释
  • 原始数据去哪找?分享15个免费官方网站
  • 宝塔部署 Vue + NestJS 全栈项目
  • # [特殊字符] Unity UI 性能优化终极指南 — LayoutGroup篇
  • Apache Iceberg 如何实现分布式 ACID 事务:深度解析大数据时代的可靠数据管理
  • 计算A图片所有颜色占B图片红色区域的百分比
  • 2024-2025-2-《移动机器人设计与实践》-复习资料-8……
  • 如何监测光伏系统中的电能质量问题?分布式光伏电能质量解决方案
  • 电子电路:全面深入了解晶振的定义、作用及应用
  • Day-15【选择与循环】选择结构-if语句
  • 定时器时钟来源可以从输入捕获引脚输入
  • SPL 轻量级多源混算实践 4 - 查询 MongoDB
  • 星敏感器:卫星姿态测量的“星空导航仪”
  • Cat.1与Cat.4区别及应用场景
  • 大宽带怎么做
  • Maestro CLI云端测试以及github cl,bitrise原生cl的测试流程
  • [内核开发手册] ARM汇编指令速查表
  • 25年宁德时代新能源科技SHL 测评语言理解数字推理Verify题库
  • AutoGenTestCase - 借助AI大模型生成测试用例
  • 区块链技术赋能供应链金融:重塑信任与效率
  • vue+cesium示例:3Dtiles三维模型高度调整(附源码下载)
  • 线程池RejectedExecutionException异常
  • lanqiaoOJ 1508:N皇后问题 ← dfs
  • 当 “欧洲版 Cursor” 遇上安全危机
  • [蓝桥杯]生物芯片