前言
通常,我们创建数据表时都会增加两个字段:“创建时间”、“修改时间”。
在阿里巴巴的《阿里巴巴Java开发手册(华山版).pdf》“(一) 建表规约”中也有规范说明。
- 【强制】表必备三字段:id, create_time, update_time
- 说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time, update_time
的类型均为 datetime 类型。
所以,在插入数据时,我们需要给"create_time" 和 "update_time"添加值。
给他们两个字段插入值有两种操作:
- 数据库字段中指定默认值
- 代码层面插入值。
这里使用的是第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)
查询数据库,可以看到,插入和修改的值都已生效。