MyBatisplus的updateById() 更新null失败

889 阅读1分钟

● myabtisplus 使用updateById() 方法更新,若字段为空字符或null默认会被myabtisplus忽略,不会对数据库进行更新。解决方法如下

  1. 注解指定策略
@Data
@ApiModel("代码仓库外部导入记录表")
@TableName("devops_commit_check_rule")
public class DevopsCommitCheckRule extends BaseEntity {

    @TableField("gitlab_app_id")
    @ApiModelProperty("代码仓库id")
    private Integer gitlabAppId;

    /**
     * 该字段需要更新null或空值
     */
    @TableField(value = "rule",  updateStrategy = FieldStrategy.IGNORED)
    @ApiModelProperty("校验规则,正则表达式")
    private String rule;

}
  1. 使用update()方法
User user = new User();
    user.setId(id);
    user.setNickName(null);
 
    userService.lambdaUpdate()
            .eq(User::getId, user.getId())
            .update(user);
  • BaseMapper源码,update()可以为null,不会有null判断
/**
 * 根据 ID 修改
 *
 * @param entity 实体对象
 */
int updateById(@Param(Constants.ENTITY) T entity);

/**
 * 根据 whereEntity 条件,更新记录
 *
 * @param entity        实体对象 (set 条件值,可以为 null)
 * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
 */
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
  • 策略说明
//com.baomidou.mybatisplus.annotation.FieldStrategy
public enum FieldStrategy {
    /**
     * 忽略判断
     */
    IGNORED,
    /**
     * 非NULL判断
     */
    NOT_NULL,
    /**
     * 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断)
     */
    NOT_EMPTY,
    /**
     * 默认的,一般只用于注解里
     * <p>1. 在全局里代表 NOT_NULL</p>
     * <p>2. 在注解里代表 跟随全局</p>
     */
    DEFAULT,
    /**
     * 不加入 SQL
     */
    NEVER
}
// com.baomidou.mybatisplus.annotation.TableField
/**
     * 字段验证策略之 update: 当更新操作时,该字段拼接set语句时的策略
     * <p>
     * IGNORED: 直接拼接 update table_a set column=#{columnProperty}, 属性为null/空string都会被set进去
     * NOT_NULL: update table_a set <if test="columnProperty != null">column=#{columnProperty}</if>
     * NOT_EMPTY: update table_a set <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
     * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL
     *
     * @since 3.1.2
     */
    FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;