# MyBatis-Plus教程 - 12 自动填充
什么是自动填充?
我们在插入或更新数据的时候,经常需要设置插入时间或更新时间,每个表的插入和更新操作都需要进行这些相同的操作。
我们可以使用 MyBatis-Plus 提供的自动填充功能,在插入或更新的时候,自动填充类似创建时间、更新时间、操作人等字段,减少手动设置这些字段的工作量,并确保数据的一致性。
# 12.1 自动填充的实现
下面以自动填充创建时间和更新时间为例,演示自动填充的实现。
# 1 数据库表设置
首先数据库得有创建时间和更新时间的字段,添加 create_time
和 update_time
字段,类型为 datetime
。
前面我的表中已经有了。
# 2 修改pojo
实体类中属性需要添加 @TableField
注解,
User.java:
@Data
@TableName("tb_user")
public class User {
private Long id;
private String username;
private String password;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在 createTime
和 updateTime
属性上添加 @TableField
注解。FieldFill.INSERT
表示插入的时候填充,FieldFill.INSERT_UPDATE
表示插入和更新的时候填充,还有 FieldFill.UPDATE
可以使用,表示只有在更新的时候自动填充。
# 3 实现 MetaObjectHandler
创建包(自定定义或使用已存在的包),并在其下创建一个类来实现 MetaObjectHandler
接口,并重写 insertFill
和 updateFill
方法。
这个类的主要作用就是负责填充工作。
package com.foooor.helloplus.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component
public class FoooorMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 插入的时候填充createTime和updateTime
Date date = new Date();
setFieldValByName("createTime", date, metaObject);
setFieldValByName("updateTime", date, metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
// 更新的时候填充updateTime
setFieldValByName("updateTime", new Date(), metaObject);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
添加 @Component
注解,注册到 Spring
容器中。
# 4 测试
在插入和更新的时候,不用设置创建时间和更新时间,MyBatis-Plus 会自动进行设置。
User user = new User();
user.setUsername("foooor");
user.setEmail("foooor@foooor.com");
user.setPassword("123456");
user.setAge(13);
int result = userMapper.insert(user);
log.info("插入用户结果:{}", result);
log.info("插入用户:{}", user.getId());
2
3
4
5
6
7
8
9
使用 MyBatis-Plus 提供的插入和更新方法才有效,自己编写的 MyBatis 实现的 Mapper 接口无效。
如果数据库的时间不对(一般是多了或少了多少个小时),可能是时区不对。
可以先设置数据库的时区:
# 数据库设置为东八区
set GLOBAL time_zone = '+8:00';
2
然后设置数据库服务器所在的时区:
# 数据库连接地址设置为serverTimezone=Asia/Shanghai
jdbc:mysql://localhost:3306/foooor_db?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
2
← 11-映射枚举 13-悲观锁与乐观锁 →