尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

详细介绍:saveOrUpdate 有个缺点,不会把值赋值为null,解决办法

详细介绍:saveOrUpdate 有个缺点,不会把值赋值为null,解决办法
📅 发布时间:2026/6/19 9:47:06

针对 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(特殊场景)。

相关新闻

  • HTML 速查列表 - 教程
  • 学习问题日记-4
  • Codeforces Round 1042 (CF2131) 补题笔记(A-E)

最新新闻

  • 天津手表回收避坑指南:实测5家正规门店,哪家更让人放心? - 名奢变现站
  • 武汉卖金不用出门!上门回收品牌深度测评,合扬无损耗计价登顶榜首 - 奢侈品交易观察员
  • 深入解析MC9S08DE60内存映射与寄存器配置:从原理到实战优化
  • pandas多维聚合生产实践:滚动窗口、分组展开与性能优化
  • 2026沈阳钻石回收没有证书能卖吗?实测1200笔无票钻石成交记录 - 奢品小当家
  • 本草拾光商行 —— 承德满族人,全品类回收,专业爱好驱动,报价地道 - 深鉴新闻

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号