今天遇到一个阴间问题。
问题描述
拟有表结构如下:
- id ——(自增id)
- uuid ——(唯一标识符id)
- content ——(表的内容,不做讨论)
- createTime ——(DateTime类型)
- updateTime ——(DateTime类型)
现在有这样一个业务需求,让你根据UUID从mysql中取出一条信息的update信息。Mybatis可以提供Timestamp类型来对应Mysql中的DateTime类型,在取出DateTime类型的数据的时候可以自动转型为Timestamp类型。于是你开始写代码:
Interface代码如下:
public Timestamp getUpdateTime(@Param("UUID") String UUID);
Mapper代码如下:
<select id="getUpdateTime" resultType="java.sql.Timestamp">
select updateTime from XXX where UUID = #{UUID};
</select>
你针对Interface代码进行单元测试,然后你发现,通过mybatis取出来的时间戳结果和你单独运行sql语句取出来的时间戳不相同。你打开mysql终端:
mysql> select updateTime from XXX where UUID = "...";
+---------------------+
| updateTime |
+---------------------+
| 2020-07-23 15:12:40 |
+---------------------+
1 row in set (0.00 sec)
然后你再去Interface的单元测试打印通过Mybatis取出来的时间戳,他的结果竟然是:
...
2020-07-23 15:20:31.363 INFO 23263 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-07-23 15:20:31.943 INFO 23263 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2020-07-24 04:12:40.0
日期变了,小时数变了,可是分秒数都没有变——第一反应就是时差。
检查一下连接mysql的jdbc驱动url(如果是Springboot项目,在application.yml文件中配置):
url: jdbc:mysql://localhost:3306/XXX
加上时区后缀,将其更改为:
url: jdbc:mysql://localhost:3306/XXX?serverTimezone=CTT
问题解决。
其他插入时间和取出时间不一致的问题也可以参考类似的思路,mysql的时区设置确实是一个容易忽视的点。