根据阿里巴巴开发手册,有这么一句话:所有的数据库表当中必须有gmt_create、gmt_modified,几乎所有的表都要配置上!而且需要自动化!!!
对于创建时间、修改时间这些字段,我们是希望在添加数据或修改数据的时候可以自动填充的。
要完成自动填充的功能,有两种解决方案,一种是在创建表时对某个字段进行配置,还有一种就是使用MyBatis-Plus的自动填充功能。
方法一
在创建表时给字段设置默认值CURRENT_TIMESTAMP
(这个方法是mysql版本在5之上,否则会报错)
创建时间的默认值设置为CURRENT_TIMESTAMP
添加数据后就会将当前时间填充进去
更新时间的默认值同样设置为CURRENT_TIMESTAMP
,并勾选上根据当前时间戳更新
对数据进行修改后就会将当前时间填充进去
方法二
使用MyBatis-Plus的自动填充处理器
首先编写自动填充处理类,并实现MetaObjectHandler接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}
然后在相关字段上加注解@TableField
@Data
public class SysDictType extends Model<SysDictType> {
private static final long serialVersionUID = 1L;
/**
* 字典主键
*/
@TableId(type = IdType.AUTO)
private Long dictId;
/**
* 字典名称
*/
private String dictName;
/**
* 字典类型
*/
private String dictType;
/**
* 状态(0正常 1停用)
*/
private String status;
/**
* 创建者
*/
private String createBy;
/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT) //插入数据时填充
private String createTime;
/**
* 更新者
*/
private String updateBy;
/**
* 更新时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT_UPDATE) //插入数据或修改数据时填充
private LocalDateTime updateTime;
/**
* 备注
*/
private String remark;
}
问题:使用MyBatis-Plus自动填充时,填充的时间跟真实时间相差8小时
首先查看MySQL的时区
show variables like'%time_zone%';
mysql> show variables like "%time_zone%";
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
可以看到有两个参数
1)全局参数system_time_zone
系统时区,在MySQL启动时会检查当前系统的时区并根据系统时区设置全局参数system_time_zone的值
system_time_zone的值根据当前系统的不同会有所不同,此处测试时系统时间为CST时间,所以值为CST,这里的CST包括了4个时区,分别是
2)全局参数time_zone
用来设置每个连接会话的时区,默认为SYSTEM时,使用全局参数system_time_zone的值。我们需要修改的就是time_zone的值
SYSTEM表示time_zone默认使用system_time_zone的时区,此处即CST
解决方法
1)修改mysql的配置,强制它为中国标准时间,而不是其他。
mysql> set global time_zone='+08:00';
mysql> set time_zone='+08:00';
mysql> flush privileges;
注意:这种修改只在当前的MySQL启动状态生效,如果MySQL重启,则恢复到my.ini的设置状态。如果需要让配置永久生效,就要修改my.ini配置文件。
在[mysqld]的下面添加或者修改如下内容
default-time_zone='+8:00'
修改完配置文件后需要重启mysql服务器,让配置生效
2)如果不想修改MySQL的配置,就需要修改数据源配置中的url,将serverTimezone设置为Asia/Shanghai
datasource.url=jdbc:mysql://localhost:3306/sys_dict_type?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8