使用Mybatis-plus更新null字段的“坑”及解决办法

1 问题由来

遇到一个需求,需要对 原数据的某个字段置为null,参考了教程,使用了注解

@TableField(value = “nick_name”,strategy = FieldStrategy.IGNORED)
private String nickName;

在User实体对象的属性上加了“strategy = FieldStrategy.IGNORED”,成功的将数据库对应的字段更新成了null。。但是,但是,但是其他的更新的sql也会跳过null值检查,造成的结果就是,另一个update语句,也将“nick_name”更新成了null…导致线上的数据直接出现问题。。。。

2 替换的解决办法

使用条件构造器组装sql

        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(User::getId, user.getId());
        wrapper.set(User::getNickName, null);
        this.update(wrapper);

wrapper.set(User::getNickName, null);
将 nick_name设为null

不要使用 strategy = FieldStrategy.IGNORED,
不要使用 strategy = FieldStrategy.IGNORED,
不要使用 strategy = FieldStrategy.IGNORED,

3 为什么不建议使用注解

为了方法的通用性,updateById(T model)等其他更新方法,众所周知组装SQL一般会过滤null对应的字段(为null时不更新),但是,一旦加上了该注解,就会造成 updateById 有的过滤null,有的不过滤。。。这样的设计留的坑太大,稍不注意,就会把数据库对应的字段置为null…估计要跑路了

附:

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

猜你喜欢

转载自blog.csdn.net/Draymond_feng/article/details/107896977