如何解决MyBatis-Plus更新字段为Null无法成功的问题

后端 潘老师 1个月前 (03-11) 76 ℃ (0) 扫码查看

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.panziye.com/back/15773.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】