MyBatis-Plus更新字段为null的三种解决方案

 更新时间:2025年10月11日 08:26:23   作者:一勺菠萝丶  
这篇文章主要为大家详细介绍了MyBatis-Plus更新字段为null的三种解决方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

在使用 MyBatis-Plus 进行数据库更新时,很多小伙伴会遇到一个问题:

当某个字段传了 null 时,updateById 默认 不会更新该字段,数据库里的值依然保留。

这个问题在你想把字段置空时就会很麻烦。下面我给大家讲几个解决方案,小白也能快速上手。

问题示例

假设我们有一个更新方法:

@Override
@Transactional(rollbackFor = Exception.class)
public void updateCarousel(@Valid CarouselUpdateReqVO updateReqVO) {
    // 校验记录存在
    validateCarouselExists(updateReqVO.getId());

    // 转换实体类
    CarouselDO updateObj = BeanUtils.toBean(updateReqVO, CarouselDO.class);

    // 更新数据库
    carouselMapper.updateById(updateObj);
}

如果 updateReqVO.getLinkId()null,执行 updateById 后,link_id 不会被更新,数据库值不会变成 null

这是 MyBatis-Plus 默认策略导致的,它默认 忽略 null 值字段

方案 1:修改实体类策略,让 null 也更新

MyBatis-Plus 提供了 @TableField(updateStrategy = FieldStrategy) 来控制字段更新策略。

import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;

@TableField(updateStrategy = FieldStrategy.ALWAYS)
private Long linkId;

策略说明:

策略作用
ALWAYS永远更新,即使字段为 null,也会更新到数据库
NOT_NULL默认值,字段为 null 时不会更新
NOT_EMPTY字符串类型使用,空字符串也会忽略
NEVER永不更新
DEFAULT使用全局默认策略

如果字段使用 ALWAYS,当你传 null 时,就会把数据库字段置空。

优点:简单直接,只需改实体类。

缺点:全局生效,可能影响其它更新场景。

方案 2:使用 UpdateWrapper 或 LambdaUpdateWrapper 动态更新

如果你只想在某次更新操作中支持 null 更新,而不改实体类,可以手动构建更新条件:

CarouselDO updateObj = BeanUtils.toBean(updateReqVO, CarouselDO.class);

LambdaUpdateWrapper<CarouselDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(CarouselDO::getId, updateObj.getId())
       .set(CarouselDO::getLinkId, updateObj.getLinkId()); // null 也可以更新

carouselMapper.update(null, wrapper);

或者使用普通 UpdateWrapper:

UpdateWrapper<CarouselDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", updateObj.getId())
             .set("link_id", updateObj.getLinkId()); // null 也可以更新

carouselMapper.update(updateObj, updateWrapper);

优点:灵活,只针对当前更新操作生效。

缺点:字段较多时,需要手动写每个字段。

方案 3:自定义 Mapper SQL

当字段较多或者更新规则复杂时,可以直接写自定义 SQL:

<update id="updateCarousel">
    update carousel
    set
        link_id = #{linkId},
        title = #{title},
        description = #{description}
    where id = #{id}
</update>

完全控制字段更新规则,包括 null 值。

失去 MyBatis-Plus 自动映射便利。

小结

方案优点缺点适用场景
实体类设置 ALWAYS简单,全局生效影响所有更新操作字段允许全局置空
LambdaUpdateWrapper / UpdateWrapper灵活,针对单次操作写法稍复杂单次更新可能置空字段
自定义 Mapper SQL完全控制,适合复杂场景失去自动映射批量或复杂更新

推荐做法

  • 偶尔置空 → 用 方案 2
  • 经常置空 → 用 方案 1
  • 更新逻辑复杂 → 用 方案 3

总结

MyBatis-Plus 默认忽略 null 值是为了安全,但当你需要置空数据库字段时,需要使用 FieldStrategy.ALWAYS 或手动更新。

掌握这几种方式后,你就能灵活处理 null 值字段更新,不再受默认策略限制。

到此这篇关于MyBatis-Plus更新字段为null的三种解决方案的文章就介绍到这了,更多相关MyBatis Plus更新字段为null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的==使用方法详解

    Java中的==使用方法详解

    这篇文章主要给大家介绍了关于Java中的==使用方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-09-09
  • SpringBoot如何接收前端传来的json数据

    SpringBoot如何接收前端传来的json数据

    这篇文章主要介绍了SpringBoot如何接收前端传来的json数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • IDEA 2021.2 激活教程及启动报错问题解决方法

    IDEA 2021.2 激活教程及启动报错问题解决方法

    这篇文章主要介绍了IDEA 2021.2 启动报错及激活教程,文章开头给大家介绍了idea2021最新激活方法,关于idea2021启动报错的问题小编也给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Spring Boot+Aop记录用户操作日志实战记录

    Spring Boot+Aop记录用户操作日志实战记录

    在Spring框架中使用AOP配合自定义注解可以方便的实现用户操作的监控,下面这篇文章主要给大家介绍了关于Spring Boot+Aop记录用户操作日志实战的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Java中@RequiredArgsConstructor使用详解

    Java中@RequiredArgsConstructor使用详解

    这篇文章主要介绍了Java中@RequiredArgsConstructor使用的相关资料,@RequiredArgsConstructor是Lombok库提供的一个注解,用于自动生成一个包含所有final字段和非空字段的构造函数,需要的朋友可以参考下
    2025-05-05
  • springMVC发送邮件的简单实现

    springMVC发送邮件的简单实现

    本篇文章主要介绍了springMVC发送邮件的简单实现 ,主要是利用利用javax.mail发送邮件,图片与附件都可发送,有兴趣的可以了解一下
    2017-04-04
  • RocketMQ的顺序消费机制详解

    RocketMQ的顺序消费机制详解

    这篇文章主要介绍了RocketMQ的顺序消费机制详解,顺序消息是指对于一个指定的 Topic ,消息严格按照先进先出(FIFO)的原则进行消息发布和消费,即先发布的消息先消费,后发布的消息后消费,,需要的朋友可以参考下
    2023-10-10
  • mybatis学习笔记之mybatis注解配置详解

    mybatis学习笔记之mybatis注解配置详解

    本篇文章主要介绍了mybatis学习笔记之mybatis注解配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • spring MVC搭建及配置详解

    spring MVC搭建及配置详解

    本篇文章主要介绍了spring MVC配置方法,要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理,有兴趣的可以了解一下。
    2017-01-01
  • SpringBoot配置发送Email的示例代码

    SpringBoot配置发送Email的示例代码

    本篇文章主要介绍了SpringBoot配置发送Email的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论