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;
本节阅读完毕!
(分享)