MyBatis-Plus中无法更新字段值为null的解决方案

问题场景:

项目开发中使用了MyBatis-Plus,但是某个更新的业务场景需要将字段更新为null,这个用MyBatis-Plus简直不要太简单了啦,updateById()方法不就可以了吗,省去了手写sql,又是偷懒的一天。。。鹅鹅鹅???怎么回事???怎么没有更新到???

原因分析:

查询资料得知:MyBatis-Plus在更新的时候会对字段做null值判断,默认不更新null值字段,会自动忽略。
既然如此是不是又要回到原始社会手写sql?不不不,坚决不

再次查询资料得知,MyBatis-Plus的 @TableField 注解有一个属性更新策略:updateStrategy。
源码如下:

package com.baomidou.mybatisplus.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.ibatis.type.UnknownTypeHandler;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableField {
    String value() default "";

    boolean exist() default true;

    String condition() default "";

    String update() default "";

    FieldStrategy insertStrategy() default FieldStrategy.DEFAULT;
	//更新策略
    FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;

    FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;

    FieldFill fill() default FieldFill.DEFAULT;

    boolean select() default true;

    boolean keepGlobalFormat() default false;

    JdbcType jdbcType() default JdbcType.UNDEFINED;

    Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;

    boolean javaType() default false;

    String numericScale() default "";
}

根据@TableField 注解可知更新策略默认:FieldStrategy.DEFAULT

枚举类FieldStrategy源码如下:

package com.baomidou.mybatisplus.annotation;

public enum FieldStrategy {
    IGNORED,
    NOT_NULL,
    NOT_EMPTY,
    DEFAULT,
    NEVER;
    private FieldStrategy() {
    }
}

FieldStrategy 各枚举值释义:

  • IGNORED:忽略判断,无论实体对象的字段值是否为空,都会进行更新操作。
  • NOT_NULL:非空判断,只对字符串类型字段,其他类型字段依然为非 NULL 判断。
  • NOT_EMPTY:非空判断,只对字符串类型字段,其他类型字段依然为非 NULL 判断。
  • DEFAULT:默认策略,使用全局配置的策略。若未配置全局策略,则默认为NOT_NULL。
  • NEVER:绝不,见名知意,就是有该枚举值的属性值不进行更新操作。

解决方案:

经过上面详解可知,只需要一个注解即可解决问题,如下代码:

 @TableField(value = "risk_category",updateStrategy = FieldStrategy.IGNORED)
 private Integer riskCategory;

注意要慎用,运行更新为NULL,可能项目中其他地方也调用了框架方法,如果没有设置值,可能会导致误更新为NULL。
如有不正确的地方望各位加以指出纠正

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值