MySQL实现字段自动填充功能

根据阿里巴巴开发手册,有这么一句话:所有的数据库表当中必须有gmt_create、gmt_modified,几乎所有的表都要配置上!而且需要自动化!!!

对于创建时间、修改时间这些字段,我们是希望在添加数据或修改数据的时候可以自动填充的。

要完成自动填充的功能,有两种解决方案,一种是在创建表时对某个字段进行配置,还有一种就是使用MyBatis-Plus的自动填充功能。

  • 方法一

    在创建表时给字段设置默认值CURRENT_TIMESTAMP(这个方法是mysql版本在5之上,否则会报错)

创建时间的默认值设置为CURRENT_TIMESTAMP
添加数据后就会将当前时间填充进去

MySQL实现字段自动填充功能_第1张图片

更新时间的默认值同样设置为CURRENT_TIMESTAMP,并勾选上根据当前时间戳更新
对数据进行修改后就会将当前时间填充进去

MySQL实现字段自动填充功能_第2张图片

  • 方法二

    使用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个时区,分别是

  • 美国中部时间 Central Standard Time (USA) UTC-06:00
  • 澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
  • 中国标准时 China Standard Time UTC+08:00
  • 古巴标准时 Cuba Standard Time UTC-04:00

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

你可能感兴趣的:(MySQL,mysql,mybatis,java)