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