问题场景:
项目开发中使用了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。
如有不正确的地方望各位加以指出纠正