【Mybatis-plus】使用Mybatis-plus更新null字段解决方案

本文探讨了在MyBatis-Plus中如何避免通过全局配置和局部注解方式更新字段时产生的空值误修改问题,推荐使用条件构造器组装SQL来精确控制字段更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


目前项目中遇到一个需求,需要将数据库中的某一条数据的一个字段把它修改为null。

全局配置(不推荐)

MyBatis-Plus 使用配置 之 updateStrateg: https://baomidou.com/pages/56bac0/#updatestrategy

mybatis-plus:
  global-config:
    db-config:
      # 更新字段为空时同样进行修改
      update-strategy: ignored

局部更新

方式一:@TableField(strategy = FieldStrategy.IGNORED)(不推荐)

因为项目使用的Mybatis-plus,而Mybatis-plus自带一个注解方式:

@TableField(strategy = FieldStrategy.IGNORED)
private String sort;

如上所示,在更新数据的时候,实体对象的属性上加了“strategy = FieldStrategy.IGNORED”,可以成功的将数据库对应的字段更新成了null。

但是,其他的更新的sql也会跳过null值检查,会造成的结果就是,另一个update语句,如果修改的时候没有给该字段赋值也会将“sort”更新成了null,导致很严重的问题。

更新的时候,进行null值插入: @TableField(updateStrategy = FieldStrategy.IGNORED)

所以,不建议使用这种方式做空置修改。

方式二:条件构造器组装sql

使用Mybatis-plus的条件构造器组装sql:

@Override
@Transactional(rollbackFor = Exception.class)
public void edit(Integer id, String authorType) {
    LambdaUpdateWrapper<WallpaperRecommendAuthor> wrapper = new LambdaUpdateWrapper<>();
    wrapper.eq(WallpaperRecommendAuthor::getId, id);
    wrapper.set(WallpaperRecommendAuthor::getAuthorType, authorType);
    wrapper.set(WallpaperRecommendAuthor::getUpdateTime, LocalDateTime.now());
    if(authorType.equals("3")){
        wrapper.set(WallpaperRecommendAuthor::getSort, null);
    }
    this.update(wrapper);
}

该方法,根据对象的id,对其它赋值的属性进行修改(也可以赋值为null)。


备注:
不建议使用 strategy = FieldStrategy.IGNORED 和 全局更新

public enum FieldStrategy {
	IGNORED(0, “忽略判断”),
	NOT_NULL(1, “非 NULL 判断”),
	NOT_EMPTY(2, “非空判断”);
	//省略部分代码
}

因为一旦加上了该注解,就会造成 updateById 有的过滤null,有的不过滤,这样的设计留的坑太大,稍不注意,就会把数据库对应的字段置为null,造成无法挽回的损失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值