目前项目中遇到一个需求,需要将数据库中的某一条数据的一个字段把它修改为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,造成无法挽回的损失。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐