mybatisplus updata 实现字段自减

本文探讨了在使用MyBatisPlus框架时,如何针对特定ID更新数据库中Seckill表的number字段,并解决了在更新操作中遇到的空指针异常问题。通过获取现有记录,修改number值并重新设置到对象中,确保了更新操作的正确执行。

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

 public   SeckillRes   reducenumber(Long id ,  SeckillReq seckillReq){
        Seckill seckill = zDozerBeanUtil.convert(seckillReq,Seckill.class);
        Seckill getselect = getById(id);
        Integer getnumber =   getselect.getNumber();
//           Integer  c = seckill.getNumber();
       if(getnumber > 0) {
           getnumber--;
        }
       seckill.setSeckillId(id);
       seckill.setNumber(getnumber);
       //seckillMapper.updateById(seckill);
        EntityWrapper ew = new EntityWrapper();
        ew.eq("id", id);
           Integer a =   seckillMapper.update(seckill, ew);
           SeckillRes seckillRes = new SeckillRes();
           return  seckillRes;
    }

对于mp update根据id进行更新
由于要把number自减
所以先根据id查询得到number的值进行–
然后在把他set到对象(seckill)中
在过程中遇到空指针报错,是因为–后的number没有set到对象中
update(实体,构造条件(构造器));
updateById(实体);

### 实现 MyBatis-Plus 更新操作时跳过 NULL 字段 在 MyBatis-Plus 中,默认行为是在执行更新操作时会忽略字段值为 `NULL` 的情况。这是由于其默认的字段策略设置为 `FieldStrategy.NOT_NULL`,这意味着当实体对象中的某个字段值为 `NULL` 时,它不会被纳入到 SQL 的 SET 子句中[^1]。 如果希望在更新操作中完全跳过这些 `NULL` 值而不影响其他字段,则可以通过调整字段策略来实现这一需求。具体方法如下: #### 配置字段策略 通过在实体类字段上指定注解 `@TableField` 并设置 `updateStrategy = FieldStrategy.IGNORED`,可以让 MyBatis-Plus 在生成更新语句时忽略那些值为 `NULL` 的字段。这样即使前端传递了 `NULL` 值也不会将其写入数据库[^3]。 ```java import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; public class User { @TableField(updateStrategy = FieldStrategy.IGNORED) private String email; // 如果此字段为 null 则会被忽略 public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } ``` 上述代码片段展示了如何针对单个字段应用这种策略。如果有多个字段都需要这样的处理方式,可以在每个需要特殊对待的字段上重复使用相同的注解配置。 #### 自定义全局配置 (可选) 除了逐一手动标记每一个可能涉及这种情况的字段外,还可以考虑自定义全局规则以少冗余工作量。这通常涉及到创建自己的元对象处理器 (`MetaObjectHandler`) 或者覆盖默认的行为逻辑[^4]。 需要注意的是,虽然这种方法能够满足特定场景下的业务需求,但在实际项目开发过程中应谨慎评估潜在风险——比如某些时候确实存在将某列显式设为空的需求,此时采用统一忽略所有输入端传来的 Null 可能会引起意外后果。 ### 总结 为了使 MyBatis Plus 在执行 update 操作时不把值为 null 的字段也加入到 sql 的 set 条件里去, 应该利用@TableField 注解并设定合适的 field strategy 属性值如 IGNORED 。如此一来便可达成仅对非空数据项实施变更的目的[^2]. ```python # 示例 Python 伪代码展示概念而非真实语法 def my_update(entity): fields_to_set = [] for field in entity.__dict__: value = getattr(entity, field) if value is not None: fields_to_set.append(f"{field}={value}") query = f"UPDATE table_name SET {','.join(fields_to_set)} WHERE id={entity.id}" execute(query) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值