# MyBatis-Plus教程 - 12 自动填充

什么是自动填充?

我们在插入或更新数据的时候,经常需要设置插入时间或更新时间,每个表的插入和更新操作都需要进行这些相同的操作。

我们可以使用 MyBatis-Plus 提供的自动填充功能,在插入或更新的时候,自动填充类似创建时间、更新时间、操作人等字段,减少手动设置这些字段的工作量,并确保数据的一致性。

# 12.1 自动填充的实现

下面以自动填充创建时间和更新时间为例,演示自动填充的实现。

# 1 数据库表设置

首先数据库得有创建时间和更新时间的字段,添加 create_timeupdate_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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

createTimeupdateTime 属性上添加 @TableField 注解。FieldFill.INSERT 表示插入的时候填充,FieldFill.INSERT_UPDATE 表示插入和更新的时候填充,还有 FieldFill.UPDATE 可以使用,表示只有在更新的时候自动填充。

# 3 实现 MetaObjectHandler

创建包(自定定义或使用已存在的包),并在其下创建一个类来实现 MetaObjectHandler 接口,并重写 insertFillupdateFill 方法。

这个类的主要作用就是负责填充工作。

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);
    }

}
1
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());
1
2
3
4
5
6
7
8
9

使用 MyBatis-Plus 提供的插入和更新方法才有效,自己编写的 MyBatis 实现的 Mapper 接口无效。


如果数据库的时间不对(一般是多了或少了多少个小时),可能是时区不对。

可以先设置数据库的时区:

# 数据库设置为东八区
set GLOBAL time_zone = '+8:00';
1
2

然后设置数据库服务器所在的时区:

# 数据库连接地址设置为serverTimezone=Asia/Shanghai
jdbc:mysql://localhost:3306/foooor_db?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
1
2