MybatisPlus自动填充

400

MybatisPlus 提供了自动填充功能,以简化在数据库表如用户表(包含id, name, age, email, createTime, updateTime等字段)中管理插入、更新时间及负责人信息的工作。传统做法需在每次CRUD操作前手动为这些字段赋值,既易出错又造成代码冗余。MyBatis-Plus通过两种方式实现自动填充:数据库层面和编程层面。

具体到编程实现,首先在User实体类中为createTime和updateTime字段添加@TableField注解,分别标注为@TableField(fill = FieldFill.INSERT)和@TableField(fill = FieldFill.INSERT_UPDATE),

@Data
@ApiModel("用户")
public class User {

    @ApiModelProperty("用户名")
    private String username;


    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty("创建时间")
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty("更新时间")
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty("创建人id")
    private Integer createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty("更新人id")
    private Integer updateUser;


}

表示在插入和/或更新时自动填充这些字段的值。

接着,定义一个实现了MetaObjectHandler接口的处理器类MybatisPlusConfig
并重写其 insertFill()和updateFill() 方法,这两个方法会在执行插入和更新操作时被调用。在insertFill()方法中,通过setFieldValByName()方法将当前时间为createTime字段赋值;在updateFill()方法中仅更新updateTime字段。

@Slf4j
@Configuration
public class MybatisPlusConfig implements MetaObjectHandler {
 
    /**
     * 添加时  自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("mybatisplus公共字段填充[insert]...");
        metaObject.setValue("createTime", LocalDateTime.now());//创建时间
        metaObject.setValue("updateTime", LocalDateTime.now());//修改时间
        metaObject.setValue("createUser",  BaseContext.getUser().getId());//创建人ID
        metaObject.setValue("updateUser",  BaseContext.getUser().getId());//修改人ID
    }

    /**
     * 更新时 自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("mybatisplus公共字段填充[update]...");
        metaObject.setValue("updateTime", LocalDateTime.now());//修改时间
        metaObject.setValue("updateUser",  BaseContext.getUser().getId());//修改人ID
    }
 
}

如何使用这个自动填充机制:首先插入一条新用户记录,观察createTime和updateTime字段是否已自动填充;然后对该用户进行更新操作,验证updateTime字段确实发生了变化。
需要注意的是,MetaObjectHandler的默认行为是不覆盖已有值且不填充null值,因此只有当字段未设置值时才会进行自动填充。
同时,要使Mybatis-Plus识别并利用这些自动填充规则,相关字段必须明确声明**@TableField注解**,并选择合适的fill策略。此外,为了保证自动填充处理器生效,应将其声明为@Component或@Bean进行依赖注入。

最后提及,如果需要更细粒度地控制根据注解FieldFill.xxx、字段名及其类型来进行自动填充,则需在MetaObjectHandler父类的方法(如strictInsertFill()或strictUpdateFill())中实现相应逻辑。对于无需根据特定条件区分的情况,则可直接使用父类的fillStrategy()方法。