当前位置: 首页 > 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.jsqmd.com/news/10196/

相关文章:

  • 【OpenGL ES】光栅化插值原理和射线拾取原理
  • HTML 速查列表 - 教程
  • Exp1
  • 20_uv_wsl_installation
  • 学习问题日记-4
  • Codeforces Round 1042 (CF2131) 补题笔记(A-E)
  • 在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名AI编程助手框架需求探索
  • 表格数据自动机器学习技术解析
  • 10/8
  • 2025.10.8
  • 【QT】QString 与QString区别 - 教程
  • 连通分量tarjan学习笔记
  • [Python/地图] 基于Python绘制地图
  • 【从前端到后端导入excel资料实现批量导入-笔记模仿芋道源码的《系统管理-用户管理-导入-批量导入》】
  • 实验任务1——8
  • 实用指南:Android studio初体验
  • 一款专门为 WPF 打造的开源 Office 风格用户界面控件库
  • 给Ubuntu用户的SSH免密登入公钥文件和文件夹设置权限
  • dockercontainerd代理设置脚本
  • 2025国庆集训总结
  • tampermonkey油猴脚本, 动画疯评分显示增强脚本
  • 课后 10.8
  • 实用指南:vue3+elementplus表格表头加图标及文字提示
  • 9.29课后整理 - GENGAR
  • 深入解析:【QT】`QTextCursor::insertText()`中插入彩色文本
  • Java方法专题 - 动手动脑问题与实验总结
  • 2025年中盘点
  • 学习问题日记-3
  • 【CVE-2025-4123】Grafana完整分析SSRF和从xss到帐户接管 - 教程
  • 差分约束乘法改加减