【MyBatis-Plus】(3)自动填充

【MyBatis-Plus】(3)自动填充

前言

通常,我们创建数据表时都会增加两个字段:“创建时间”、“修改时间”。

在阿里巴巴的《阿里巴巴Java开发手册(华山版).pdf》“(一) 建表规约”中也有规范说明。

    1. 【强制】表必备三字段:id, create_time, update_time
  • 说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time, update_time
    的类型均为 datetime 类型。

所以,在插入数据时,我们需要给"create_time" 和 "update_time"添加值。

给他们两个字段插入值有两种操作:

  1. 数据库字段中指定默认值
  2. 代码层面插入值。

这里使用的是第2种,代码层面插入值。

注意:还是使用第一篇文章时的user表。需要给user表增加两个字段,分别是:"create_time"和 "update_time",类型为"datetime"

一、自动填充

参考官方文档:自动填充功能

1.修改user表

给user表中添加了两个字段:"create_time"和 "update_time",类型为"datetime"。

2.修改实体类

给实体类User增加两个属性。同时添加注解 @TableField

注解参考:@TableField

@Data
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    /** 字段自动填充策略 */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.UPDATE)
    private Date updateTime;
}

3.自定义实现类 MyMetaObjectHandler

自定一个类 MyMetaObjectHandler,实现 MetaObjectHandler 接口。

使用setFieldValByName()方法为字段设置值。

注意:需要加上@Component注解,将该类对象交给IoC容器管理。

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        // 设置字段值(当前时间)
        this.setFieldValByName("createTime", new Date(), metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        // 设置字段值(当前时间)
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

4.测试

运行插入方法,输出:

User(id=1253591398346522630, name=王五, age=20, email=123456@qq.com, createTime=Fri Apr 24 17:11:04 CST 2020, updateTime=null)

运行修改方法,输出:

修改的id设置为了刚刚插入的id,1253591398346522630。

User(id=1253591398346522630, name=李四, age=20, email=123456@qq.com, createTime=null, updateTime=Fri Apr 24 17:11:58 CST 2020)

查询数据库,可以看到,插入和修改的值都已生效。