前提
jdbc和mybatis依赖的版本
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
<scope>runtime</scope>
</dependency>
服务器所在时区UTC+8, 配置文件中设置serverTimezone=UTC
1.字段createtime是LocalDateTime类型
现在服务器时间是**18:00**,
使用**LocalDateTime=18:00**插入到数据库还是**18:00**
查询数据,服务器使用LocalDateTime查出来还是**18:00**
按道理说,服务器时间和数据库时间应该会不同的,因为服务器时区和serverTimezone的时区是不一样的,但是很明显LocalDateTime类型的数据不受serverTimezone影响,后面会有博主根据源码调试的结果也证明确实LocalDateTime类型不受serverTimezone影响
2.字段createtime是Date类型
现在服务器时间是**18:00**,
使用**Date=18:00**插入到数据库还是**10:00**
查询数据,服务器使用Date查出来还是**18:00**
因为服务器时区和serverTimezone的时区是不一样的,Date类型的数据受serverTimezone影响,后面会有博主根据源码调试的结果证明Date类型受serverTimezone影响
结论:
1.LocalDateTime在jdbc中会不经处理直接映射成数据库表中的时间。查询的时候也是会将数据库表中时间直接映射成LocalDateTime。其实就是默认数据库时区和服务器时区是一致的 2.Date类型则会在jdbc中被处理,受serverTimeZone的影响,会先将Date类型的数据转换成serverTimeZone时区的时间存入数据库。查询的时候也会根据serverTimeZone来将数据库中的时间转换成服务器时间再映射成Date类型数据。
如果感兴趣可以看看博主的另一篇文章,其中包含jdbc在插入和查询Date和LocalDateTime类型数据时的处理逻辑 jdbc源码调试之查看jdbc对LocalDateTime和Date类型的处理
|