● myabtisplus 使用updateById() 方法更新,若字段为空字符或null默认会被myabtisplus忽略,不会对数据库进行更新。解决方法如下
- 注解指定策略
@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;
}
- 使用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;