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

详细介绍: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 {
@Bean
public 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 {
@TableId
private 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.gsyq.cn/news/17357.html

相关文章:

  • 【OpenGL ES】光栅化插值原理和射线拾取原理
  • 在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名AI编程助手框架需求探索
  • 实验任务1——8
  • 实用指南:Android studio初体验
  • 给Ubuntu用户的SSH免密登入公钥文件和文件夹设置权限
  • dockercontainerd代理设置脚本
  • 9.29课后整理 - GENGAR
  • 2025年中盘点
  • 【CVE-2025-4123】Grafana完整分析SSRF和从xss到帐户接管 - 教程
  • 【学习记录】Django Channels + WebSocket 异步推流编写常用命令汇总
  • AgpdParty
  • io软件的层次结构
  • 2025年- H57-Lc165--994.腐烂的橘子(图论,广搜)--Java版 - 教程
  • 月嫂面试题
  • 对顶堆维护区间中位数板子
  • 2025 布袋包装厂家最新推荐榜:自贸区实力厂商领衔,含手提袋、帆布袋等全品类,年销 500 万级生产商精选无纺布袋/布袋生产/云南布袋包装/茶叶布袋厂家推荐
  • 2025 火烧板源头厂家最新推荐榜单:自有矿山保障品质,高硬度耐磨产品全覆盖,五莲花 / 芝麻白 / 防滑芝麻黑采购优选指南
  • Luogu P11660 我终将成为你的倒影 题解 [ 紫 ] [ 分块 ] [ 分类讨论 }
  • 深入解析:【LeetCode 热题100】回溯:括号生成 组合总和(力扣22 / 39 )(Go语言版)
  • 完整教程:基于 COM 的 XML 解析技术(MSXML) 的总结
  • PCIe扫盲——链路初始化与训练基础(二)
  • VMware ESXi 8.0U3g macOS Unlocker OEM BIOS 2.7 H3C 新华三 定制版
  • [计算机组成] 计算机字体文件及其运行原理
  • 滚动导航 - unique
  • C#基础:启用线程池执行并行任务
  • P1545 [USACO04DEC] Dividing the Path G 题解
  • java作业2
  • 关于PPT的课后作业
  • RK 系列 GPU 驱动检查方法
  • 算法第一章