【Mybatis-plus】updateById()方法不能更新字段为null的原因及解决办法

一、问题描述

​ 在日常项目开发过程中,经常会使用Mybatis-plus的updateById()方法,快速将接收道德参数或者查询结果中原本不为null的字段更新为null,并且该字段在数据库中可为null,这个时候使用updateById()并不能实现这个操作,不会报错,但是对应的字段并没有更新为null。

二、问题原因

​ Mybatis-plus的字段策略(FieldStrategy)有三种策略:

  • IGNORED:0 忽略
  • NOT_NULL:1 非 NULL,默认策略
  • NOT_EMPTY:2 非空

而默认的更新策略是NOT_NULL:非NULL; 即通过接口更新数据时数据为NULL值时将不更新进数据库。

三、解决方案

1.直接在mapper.xml中写sql:
 update table A set 字段a = null where 字段b = 条件
2.设置全局的FieldStrategy

​ 在配置文件中修改全局策略

#properties文件格式:
mybatis-plus.global-config.db-config.field-strategy=ignored
#yml文件格式:
mybatis-plus:
  global-config:
      #字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断"
    field-strategy: 0

这样做是进行全局配置,在更新时会忽略对所有字段的判断。但是如果一些字段没有传值过来,会被直接更新为null,可能会影响其它业务数据的准确性。不推荐使用此方法。

3.对指定的字段单独设置field-strategy

根据具体情况,在需要更新的字段中调整验证注解,如验非空:

@TableField(strategy=FieldStrategy.NOT_EMPTY)

这样的话,我们只需要在需要更新为null的字段上,设置忽略策略,如下:

@TableField(updateStrategy = FieldStrategy.IGNORED)
private String updateBy;

设置好了之后,在更新时就可以直接使用mybatis-plus中的updateById方法就可以成功将字段更新为null,但是这样做存在一定的弊端,就是当需要这样处理的字段比较多时,要给对应的字段都要添加上这样的注解。

4.使用update方法结合UpdateWrapper方式更新
User user=userService.lambdaQuery().eq(User::getUserId,userId).one();
if(user!=null){
    userService.update(user,new UpdateWrapper<User>().lambda()
               .set(User::getUserName,null)
               .eq(User::getUserId,user.getUserId()));

这种方法不会影响其它方法,不需要修改全局配置,也不需要在字段上单独加注解,只需要在使用的时候设置一下要修改的字段为null就可以更新成功,推荐使用方法4。

1. Mybatis Plus 的 FieldStrategy 有三种策略2. 配置3. 使用 update() 方法 1. Mybatis Plus 的 FieldStrategy 有三种策略 IGNORED:忽略。当策略为 IGNORED 时,表示忽略该字段的空判断,即无论实体对象的为空还是非空,都会进行新增、更新操作。 NOT_NULL:非 NULL。当策略为 NOT_NULL 时,表示字段不能为空,如果实体对象的为空,则不会进行新增、更新操作。 NOT_EMPTY:非空。当策略为 NOT_
使用Mybatis-plusupdateById()方法更新一条记录时:只会更新不为null字段,为null字段会不变。在真实的线上环境是这样的。 所以要是该方法,建议:new一个新的实体,将id赋,然后把需要更新字段set下。 开发项目中,使用MyBatis-PlusupdateById() 方法将查询结果中原本不为null字段更新null,该字段设置可为null。发现更新失败。 问题原因 mybatis-plus FieldStrategy 有三种策略: IGNORED:0 忽略 NOT_NULL:1 非 NULL,默认策略 NOT_EMPTY:2 非空 而默认更新策略是NOT_NULL:非 NULL;即通过接口更新数据时数据为NULL时将不更新进数据库。 1、写s...
在日常项目开发过程中,经常会使用Mybatis-plusupdateById()方法,快速将接收道德参数或者查询结果中原本不为null字段更新null,并且该字段在数据库中可为null,这个时候使用updateById()并不能实现这个操作,不会报错,但是对应的字段并没有更新null。设置好了之后,在更新时就可以直接使用mybatis-plus中的updateById方法就可以成功将字段更新null,但是这样做存在一定的弊端,就是当需要这样处理的字段比较多时,要给对应的字段都要添加上这样的注解。
一、updateById 根据主键id更新,传啥改啥!!! 对未修改的无影响 int updateById(@Param(Constants.ENTITY) T entity); 二、update 根据 whereWrapper 条件更新记录,传啥改啥!!! 可用于批量更新 // 根据 whereWrapper 条件,更新记录 int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper wh
MyBatis Plus的updateById方法可以用于更新实体对象的数据,如果使用updateById方法时传入的对象的某些属性null,那么更新操作会将数据库中对应的字段更新null。 一般而言,如果想要更新某个字段null,可以将要更新字段设置为null,然后使用updateById方法即可实现更新操作。 例如,假设有一个名为User的实体类,有两个属性:id和name。现在要将某个id为1的用户的name字段更新null,可以按照以下步骤进行: 1. 实例化一个User对象,设置id为1,设置name为null; 2. 使用updateById方法,将该User对象作为参数传入; 3. MyBatis Plus会根据这个User对象的id字段更新数据库中对应的name字段null。 需要注意的是,如果传入的User对象中有其他字段null,那么该字段也会被更新null。因此,如果不想更新其他字段,可以在实例化User对象之后,将其他字段设置为原来的再执行更新操作。 总之,MyBatis Plus的updateById方法可以更新实体对象的数据,包括将某些字段更新null