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