Mybatisplus 如何将已经有值的字段设置为空值null

终极推荐方式:
        UpdateWrapper<SkuDO> wrapper = new UpdateWrapper<>();
        wrapper.lambda()
                .set(Objects.isNull(dto.getWeights()), SkuDO::getWeights, null)
                .set(Objects.isNull(dto.getShelfLife()), SkuDO::getShelfLife, null)
                .eq(PurchaseSkuDO::getId, dto.getId()).eq(SkuDO::getIsDeleted, DeletedEnum.NORMAL.getCode());
        int update = this.getBaseMapper().update(skuDO, wrapper);
                LambdaUpdateWrapper<SpuDO> lambdaUpdate = new LambdaUpdateWrapper<>();
                lambdaUpdate.set(Objects.isNull(spuDO.getProvinceCode()),SpuDO::getProvinceCode, null);
                lambdaUpdate.set(Objects.isNull(spuDO.getProvinceName()),SpuDO::getProvinceName, null);
                lambdaUpdate.eq(SpuDO::getId, spuDO.getId());

                spuDao.update(spuDO, lambdaUpdate);

上面两种写法,其实是一种写法。都非常的推荐。本质就是显示设置需要更新为null的字段。亲测有效,无坑。

错误使用方式分析:

  1. 为何直接使用:spuDao.updateById(spuDO)、spuDao.saveOrUpdate(spuDO)不行:这个问题的核心原因是:MyBatis-Plus 的 saveOrUpdate updateById 方法(底层依赖 BaseMapper)在执行更新操作时,默认会忽略 null 值字段,只更新非 null 的属性。
  2. 为何使用下面对的方式也不行:原因是MyBatis-Plus 中 update(T entity, Wrapper<T> wrapper) 的字段过滤规则是:无论是否 “显式赋值 null”,只要字段策略是 NOT_NULL(默认),都会过滤所有 null 字段—— 它不会区分 “主动设为 null” 和 “未赋值 null”,只要值是 null,就不加入 SET 子句。

    // 1. 构建 spuDo:需要更新的字段(包括要设为 null 的字段)直接设为 null,其他字段设为目标值
    SpuDO spuDo = new SpuDO();
    spuDo.setId(1L); // 主键(必须有,用于匹配要更新的记录)
    spuDo.setName(null); // 要更新为 null 的字段
    spuDo.setPrice(new BigDecimal("5999")); // 要更新的非 null 字段
    spuDo.setStatus(1); // 其他需要更新的字段
    
    // 2. 构建 LambdaUpdateWrapper:仅保留 where 条件(不写 set 方法)
    LambdaUpdateWrapper<SpuDO> lambdaUpdate = new LambdaUpdateWrapper<>();
    lambdaUpdate.eq(SpuDO::getId, spuDo.getId()); // 唯一条件:匹配 id = ?(也可加其他条件)
    
    // 3. 执行更新:spuDo 传非 null,lambdaUpdate 仅含 where 条件
    spuDao.update(spuDo, lambdaUpdate);
  3. @TableField(updateStrategy = IGNORED) 这种方式可以。但是非常非常不建议使用:使用 @TableField(updateStrategy = IGNORED) 确实能解决 “null 字段无法更新” 的问题,但它会改变字段的默认更新行为,如果不注意业务场景,容易踩坑,核心风险是 “误覆盖数据库已有值

 

posted @ 2025-11-04 17:15  下午喝什么茶  阅读(54)  评论(0)    收藏  举报