今天遇到了一个问题,在更新数据时,mybatis-plus 不会修改属性为空的数据表字段。

在用 mybatis-plus 封装的 updateById 方法来更新数据时,想把一个字段设置为 null 值,但是发现更新后数据没有为 null 还是原来的值,这是因为 mybatis-plus 在更新的时候做了 null 判断,默认不更新为 null 的传参。

解决办法:在需要变更的实体类的属性上加一行注解即可,表示字段允许为空(since 3.1.2)。

@TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED)
private String name;

下面记录一些 mybatis-plus 注解的用法:

  • 是否为数据库表字段 默认 true 存在,false 不存在,注解加在 bean 属性上,表示当前属性不是数据库的字段,但在项目中必须使用。
@TableField(exist = false)
private String name;
  • 字段自动填充策略,在 name 这个属性执行修改时,将自动填充一个值(默认为null),即将字段修改为空,而不是不做修改。
@TableField(fill = FieldFill.UPDATE)
private String name;
  • 需要排除的属性名 excludeProperty,作用与 @TableField(exist = false) 类似,但注解加在 bean 类上,常用于排除通用基类的部分字段(since 3.3.1)。
public class BaseEntity {

    /** 创建人 */
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;

    /** 创建时间 */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    
    // ...

    /** 备注 */
    private String remark;

    // ...
    
}
@TableName(value = "bg_blog_article", excludeProperty = {"remark", "..."})
public class BlogArticle extends BaseEntity {
    // ...
}