首页 专题 文章 代码 归档
MybatisPlus自动维护数据库时间戳
2020.02.22 13:40 2020.04.05 18:45

1. 前言

什么意思呢?

在数据库中我们有created_at和updated_at字段,分别代表是插入时顺带插入此时时间,更新时是更新时间。

那么使用MybatisPlus如何实现呢?

利用数据填充功能,参考:https://mp.baomidou.com/guide/auto-fill-metainfo.html

2. 详情

package com.misiai.mybatisplus.bean;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User extends Model<User> {

    @TableId(type = IdType.AUTO)
    private Integer id;
    private String user_name;

    // 查询是不显示该字段的值
    @TableField(select = false, fill = FieldFill.INSERT)
    private String password;

    @TableField("email") // 指定数据库中实际的字段名
    private String mail;
    private Integer age;

    @TableField(exist = false) // 在数据库中不存在
    private String address;

    @TableField(fill = FieldFill.INSERT)//INSERT代表只在插入时填充
    private Date createdAt;
    @TableField(fill = FieldFill.INSERT_UPDATE)// INSERT_UPDATE 首次插入、其次更新时填充(或修改)
    private Date updatedAt;
}

主要是为实体类添加一个 @TableField(fill = FieldFill.INSERT)注解

FieldFill.INSERT代表插入时填充,INSERT_UPDATE代表插入、更新时都填充。

2.1. 实现方法

我们需要实现MybatisPlus为我们提供的MetaObjectHandler接口:

package com.misiai.mybatisplus.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.time.LocalDateTime;

@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始插入填充.....");
        if (metaObject.hasSetter("createdAt")) {
            log.info("createdAt");
            this.strictInsertFill(metaObject, "createdAt", Date.class, new Date());
        }
        if (metaObject.hasSetter("updatedAt")) {
            log.info("updatedAt");
            this.strictInsertFill(metaObject, "updatedAt", Date.class, new Date());
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始更新填充.....");
        if (metaObject.hasSetter("updatedAt")) {
            log.info("updatedAt");
            this.strictUpdateFill(metaObject, "updatedAt", Date.class, new Date());
        }
    }
}

2.2. 加入容器

然后加入Spring容器:

package com.misiai.mybatisplus.config;

@Configuration
@MapperScan("com.misiai.mybatisplus.mapper")
public class MybatisPlusConfig {

    @Bean
    public MyMetaObjectHandler myMetaObjectHandler() {
        return new MyMetaObjectHandler();
    }
}

3. 抽取公共

如果每个实体类都有id、createdAt、updateAt,那么可以抽取出来形成公共抽象类:

BaseEntity

package com.misiai.template.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

@Getter
@Setter
public abstract class BaseEntity<T extends Model<T>> extends Model<T> {
    @TableId(type = IdType.ASSIGN_ID)
    protected String id;

    @TableField(fill = FieldFill.INSERT)//INSERT代表只在插入时填充
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//get
    protected Date createdAt;

    @TableField(fill = FieldFill.INSERT_UPDATE)// INSERT_UPDATE 首次插入、其次更新时填充(或修改)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//get
    protected Date updatedAt;

}

AdminUserEntity

package com.misiai.template.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("admin_users")
public class AdminUser extends BaseEntity<AdminUser> {
    private String username;
    private String password;
}

注意点:

我们定义createdAt、updatedAt类型是Date

@TableField(fill = FieldFill.INSERT)//INSERT代表只在插入时填充
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//get
protected Date createdAt;

@TableField(fill = FieldFill.INSERT_UPDATE)// INSERT_UPDATE 首次插入、其次更新时填充(或修改)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//get
protected Date updatedAt;

那么插入时,也要是Date.class

if (metaObject.hasSetter("updatedAt")) {
    log.info("updatedAt");
    this.strictInsertFill(metaObject, "updatedAt", Date.class, new Date());
}

4. 其他

在实体类格式化时间可以在字段上加上两个注解:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//get
private Date createdAt;
本节阅读完毕! (分享
二维码图片 扫描关注我们哟