【Mybatis使用心得】updatebatchbyid不能更新所有字段解决方案

背景

日常办公中,人员信息经常变动,我的任务是把人员数据从其他系统同步过来,并删除失效的用户。
在一个例子这里插入图片描述

但是一个表字段有很多,有的字段我们表里有,但数据源接口没有,比如上次登录系统时间等,这就要求我们不能在同步的时候把表里所有字段都更新一遍。
目前的策略是只对比表中部分字段,如果变了(接口字段跟表中一个或多个字段不一致),那么就把接口传的新数据覆盖表原有数据,用的是myBatis的updatebatchbyid方法。

问题描述

代码上线后正常运行了几个月,一片祥和,奈何我闲来无事,翻看日志,发现每次同步都有那么几条数据更新,开始我还认为是这几个人信息变得比较频繁,但翻看了之前的数据,发现并不是这样,表里数据每次都没有变。
这下就需要排查原因了,排查发现是邮箱这个字段,接口中这几个人的邮箱不知为何是空的,但我们表之前落地的数据是有邮箱的,这就导致在数据对比时,这几条会被判断为数据更改,从而被更新。
但为什么表里的邮箱字段没有被更新为空呢?
经过查阅,发现问题出在myBatis-plus的更新策略上:
myBatis-plus的字段策略(FieldStrategy)有三种策略:
IGNORED:0
NOT_NULL:1 默认策略
NOT_EMPTY:2
因为我们每次不更新所有字段,只把要更新的字段传给myBatis,所以在默认策略下,邮箱变成空,在程序看来就是没传邮箱,于是就没有更新。

解决方案

知道的原因,解决就很简单,有下面几个方案:

1.在配置文件修改myBatis的默认更新策略,改成0:

在这里插入图片描述
这种方案不适合我的需求,因为如果改了全局策略,没有同步的字段都会被置为null,这是不可接受的。

2.单独设置需要更新字段的策略:

在需要更新为null的字段上单独添加策略,如下:
在这里插入图片描述

更改策略后再同步时,邮箱字段就不受全局策略影响,会同步更新为null。
这个方案好处是灵活,缺点是当需要更新的字段过多时,一个一个配置浪费时间,后期也不好维护。

3.放弃myBatis,自己写更新SQL

这个方案就很直白了,不满足需求就不用,自己写维护起来也方便,但要注意不要写出BUG。

总结

因为要更新的字段不多,最终我使用了方案2,写这篇文章也是为了同样遇到myBatis更新策略问题的朋友提供参考,当然也包括为我自己在其他场景碰到相同的问题设置个备忘录。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值