【Mybatis-plus】updateById()方法不能更新字段为null的原因及解决办法---@TableField(updateStrategy = FieldStrategy.ALWAYS)

【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 = 条件
1
2.设置全局的FieldStrategy

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

#properties文件格式:
mybatis-plus.global-config.db-config.field-strategy=ignored

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

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

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

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

@TableField(strategy=FieldStrategy.NOT_EMPTY)

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

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

最新版本:

@TableField(updateStrategy = FieldStrategy.ALWAYS)
1
package com.baomidou.mybatisplus.annotation;

/**
 * 字段策略枚举类
 * <p>
 * 如果字段是基本数据类型则最终效果等同于 {@link #ALWAYS}
 *
 * @author hubin
 * @since 2016-09-09
 */
public enum FieldStrategy {
    /**
     * 忽略判断,该字段存在语义理解问题,后续版本将废弃 github issues/5129
     */
    @Deprecated
    IGNORED,
    /**
     * 任何时候都加入 SQL
     */
    ALWAYS,
    /**
     * 非NULL判断
     */
    NOT_NULL,
    /**
     * 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断)
     */
    NOT_EMPTY,
    /**
     * 默认的,一般只用于注解里
     * <p>1. 在全局里代表 NOT_NULL</p>
     * <p>2. 在注解里代表 跟随全局</p>
     */
    DEFAULT,
    /**
     * 不加入 SQL
     */
    NEVER
}
123456789101112131415161718192021222324252627282930313233343536373839

设置好了之后,在更新时就可以直接使用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()));
}
123456

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

posted @ 2024-11-04 17:40  哩个啷个波  阅读(266)  评论(0编辑  收藏  举报