章
目
录
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
字段的问题,希望对你有帮助!