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; }
根据自己理解判断该怎么用;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。