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

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

方式一:

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

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

如上所示,在更新数据的时候,实体对象的属性上加了“strategy = FieldStrategy.IGNORED”,可以成功的将数据库对应的字段更新成了null。但是,其他的更新的sql也会跳过null值检查,会造成的结果就是,另一个update语句,如果修改的时候没有给该字段赋值也会将“sort”更新成了null,导致很严重的问题。

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

方式二:

使用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,造成无法挽回的损失。

经验分享 程序员 微信小程序 职场和发展