使用Mybatis-plus更新null字段的“坑”及解决办法
日期: 2020-08-09 分类: 跨站数据 379次阅读
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
标签:mybatis
上一篇: #实用#jdbcTemplate 获取数据库的表名 和 信息
下一篇: App抓包绕过强校验
精华推荐