行业资讯 2025年08月6日
0 收藏 0 点赞 920 浏览 2135 个字
摘要 :

文章目录 一、问题到底出在哪? 二、为啥会出现这个问题? 三、有哪些解决办法? (一)在mapper.xml文件里直接写SQL语句 (二)修改全局的FieldStrategy策略 (三)针……




  • 一、问题到底出在哪?
  • 二、为啥会出现这个问题?
  • 三、有哪些解决办法?
    • (一)在mapper.xml文件里直接写SQL语句
    • (二)修改全局的FieldStrategy策略
    • (三)针对指定字段单独设置field-strategy
    • (四)利用update方法结合UpdateWrapper方式更新

    MyBatis-Plus是一款深受开发者喜爱的工具,它能极大提高数据库操作效率。但在实际项目开发时,不少人会碰到一个问题:用updateById()方法更新数据库字段为null时,操作无法成功执行,这是怎么回事呢?本文就来详细讲讲这个问题,并给出切实可行的解决办法。

    一、问题到底出在哪?

    在日常开发中,我们常常会用到MyBatis-Plus的updateById()方法,它能快速更新数据。有时候,我们想把一些原本有值的字段更新为null,而且数据库中这些字段也允许为null。可奇怪的是,使用updateById()方法后,程序不报错,但字段值就是没更新成null,这让很多开发者摸不着头脑。

    二、为啥会出现这个问题?

    这背后的“元凶”是MyBatis-Plus的字段策略(FieldStrategy)。它一共有三种策略:

    • IGNORED:表示忽略,简单理解就是不管字段值是什么,都按正常流程处理。
    • NOT_NULL:意思是非NULL,这是默认策略。当通过接口更新数据时,如果某个字段的值是null,MyBatis-Plus就不会把这个null值更新到数据库里。
    • NOT_EMPTY:代表非空,即判断字段值是否为空字符串或null,只有不为空时才会更新。

    正是因为默认的更新策略是NOT_NULL,所以当我们想用updateById()方法把字段更新为null时,就会失败。

    三、有哪些解决办法?

    知道问题原因后,下面来看看都有哪些解决方法。

    (一)在mapper.xml文件里直接写SQL语句

    mapper.xml文件中,直接编写更新的SQL语句,就像这样:

    -- 这条SQL语句用于更新表A中的数据
    -- 将字段a的值设为null,条件是字段b满足特定条件
    update table A set 字段a = null where 字段b = 条件
    

    这种方式很直接,能精准控制更新操作,但如果项目中更新操作频繁,都这么写会增加不少工作量。

    (二)修改全局的FieldStrategy策略

    我们可以在配置文件里修改全局的字段策略。

    • properties文件格式
    # 将MyBatis-Plus的全局字段策略设置为忽略
    # 这样在更新数据时,会忽略对所有字段是否为null的判断
    mybatis-plus.global-config.db-config.field-strategy=ignored
    
    • yml文件格式
    mybatis-plus:
      global-config:
        # 字段策略,0表示“忽略判断”,1表示“非NULL判断”,2表示“非空判断”
        field-strategy: 0
    

    虽然这种全局配置的方式能解决更新null字段的问题,但它有个明显的缺点。如果某些字段没有传值,就会被直接更新为null,这可能会影响其他业务数据的准确性,所以不太推荐使用。

    (三)针对指定字段单独设置field-strategy

    根据实际需求,我们可以在需要更新的字段上调整验证注解。比如,对于一般的非空校验,可以使用@TableField(strategy=FieldStrategy.NOT_EMPTY)。要是想把某个字段更新为null,就在这个字段上设置忽略策略,代码如下:

    // 给updateBy字段设置更新策略为忽略
    // 这样在更新时,就可以把该字段更新为null
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private String updateBy;
    

    不过,如果需要这样处理的字段比较多,就得给每个字段都加上这个注解,操作起来有点繁琐。

    (四)利用update方法结合UpdateWrapper方式更新

    使用update方法搭配UpdateWrapper来更新数据,能巧妙避开前面几种方法的缺点。具体代码如下:

    // 根据userId查询用户信息
    User user=userService.lambdaQuery().eq(User::getUserId,userId).one();
    // 如果查询到用户信息
    if(user!=null){
        // 使用update方法和UpdateWrapper更新用户信息
        // 将userName字段设为null,条件是userId匹配
        userService.update(user,new UpdateWrapper<User>().lambda()
                   .set(User::getUserName,null)
                   .eq(User::getUserId,user.getUserId()));
    }
    

    这种方法不会影响其他操作,也不用修改全局配置,更不用在字段上逐个加注解,只需要在更新时设置要修改的字段为null就行,非常方便,强烈推荐使用。

    在开发过程中遇到问题不可怕,只要深入了解技术原理,总能找到合适的解决办法。希望本文介绍的内容能帮助大家顺利解决MyBatis-Plus更新null字段的问题,希望对你有帮助!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/10359.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号