MybatisPlus之时间处理问题
作者:Aholic 冲冲冲
在数据库设计时,阿里巴巴编码规约建议使用gmt_create和gmt_modified命名时间字段,并设置为datetime类型,本文介绍了两种自动填充时间字段的实现方式:SQL级别和代码级别(使用MyBatis Plus),SQL级别通过设置默认值和更新值为CURRENT_TIMESTAMP
MybatisPlus时间处理
建表
阿里巴巴编码规约中建议命名为gmt_create,gmt_modifie,并且类型datetime,我们这里用create_time create_time。
-- auto-generated definition
create table user
(
id bigint auto_increment comment '主键ID'
primary key,
name varchar(30) null comment '姓名',
age int null comment '年龄',
email varchar(50) null comment '邮箱',
create_time datetime null comment '创建时间',
create_time datetime null comment '更新时间'
);方式一:SQL级别(数据库设置)
- create_time:

- update_time:

官方解释:
- 此函数返回当前数据库系统时间戳,返回值的类型为 datetime,并且不含数据库时区偏移量。
- CURRENT_TIMESTAMP 从运行 SQL Server 实例的计算机的操作系统中获得此值
将Default Expression设置为CURRENT_TIMESTAMP的作用:
- 在你进行插入、创建一条数据时给定一个默认值。
- 将On Update设置为CURRENT_TIMESTAMP的作用:
- 在你进行更新数据时会按照CURRENT_TIMESTAMP的规定更新你的值。(相当于实现了操作后时间的自动更新)
方式二:代码级别(mybatisplus自动填充)
Java中(springboot)
建一个pojo实体类:
package com.hyq.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT) //插入时更新
private Date createTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT_UPDATE) //添加时更新 之后写策略
private Date updateTime;
}
重点看时间的处理:
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT) //插入时更新
private Date createTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT_UPDATE) //添加时更新 之后写策略
private Date updateTime;官方描述:
- 描述:表名注解,标识实体类对应的表
- 使用位置:实体类

写完@TableField后可以去配置一个handler我们这里取名为MyMetaObjectHandler;
实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
package com.hyq.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 //一定不要忘记把处理器加到io容器c中
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill......");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start insert fill......");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
这里的setFieldValByName源码如下:
/**
* 通用填充
*
* @param fieldName java bean property name 字段名称
* @param fieldVal java bean property value 属性值
* @param metaObject meta object parameter 元对象参数
*/
default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
if (Objects.nonNull(fieldVal) && metaObject.hasSetter(fieldName)) {
metaObject.setValue(fieldName, fieldVal);
}
return this;
}根据自己理解判断该怎么用;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
