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

本文详细探讨了在使用MyBatisPlus框架进行数据库操作时,如何避免因注解设置不当导致的意外字段置空问题。通过对比不同方法,推荐使用LambdaUpdateWrapper条件构造器来精确控制SQL更新语句,避免全局字段策略带来的副作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值