Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据

使用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, “非空判断”);
//省略部分代码
}

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: #实用#jdbcTemplate 获取数据库的表名 和 信息

下一篇: App抓包绕过强校验

精华推荐