Java LocalDateTime与mybatis的转换

zin*_*rks 4 java mysql datetime mybatis

环境

  • mybatis-spring-boot-starter 2.0.1
  • mybatis 3.5.1
  • mybatis-spring 2.0.1
  • mysql-连接器-java 8.0.16

jvm 时区 : Asia/Seoul


我的测试查询

选择#{从},#{到}

输入

YearMonth input = YearMonth.of(year, month)
LocalDateTime from = input.atDay(1).atStartOfDay()
LocalDateTime to = input.atEndOfMonth().atTime(LocalTime.MAX)
Run Code Online (Sandbox Code Playgroud)

情况1。添加serverTimezone=UTC到 jdbc url

情况1。添加serverTimezone=Asia/Seoul到 jdbc url

[11:03:54] [main] [DEBUG] BaseJdbcLogger.debug(143)| ==>  Preparing: SELECT ?, ? 
[11:03:54] [main] [DEBUG] BaseJdbcLogger.debug(143)| ==> Parameters: 2020-01-01T00:00(LocalDateTime), 2020-01-31T23:59:59.999999999(LocalDateTime)
[11:03:54] [main] [DEBUG] Slf4jSpyLogDelegator.sqlTimingOccurred(368)|  com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)
1. SELECT 2020-01-01T00:00, 2020-01-31T23:59:59.999999999
 {executed in 3 msec}
[11:03:54] [main] [INFO ] Slf4jSpyLogDelegator.resultSetCollected(610)| 
|----------------------|----------------------|
|2019-12-31 15:00:00.0 |2020-01-31 15:00:00.0 |
|----------------------|----------------------|
|----------------------|----------------------|
Run Code Online (Sandbox Code Playgroud)
[14:27:16] [main] [DEBUG] BaseJdbcLogger.debug(143)| ==>  Preparing: SELECT ?, ? 
[14:27:16] [main] [DEBUG] BaseJdbcLogger.debug(143)| ==> Parameters: 2020-01-01T00:00(LocalDateTime), 2020-01-31T23:59:59.999999999(LocalDateTime)
[14:27:16] [main] [DEBUG] Slf4jSpyLogDelegator.sqlTimingOccurred(368)|  com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)
1. SELECT 2020-01-01T00:00, 2020-01-31T23:59:59.999999999
 {executed in 4 msec}
[14:27:16] [main] [INFO ] Slf4jSpyLogDelegator.resultSetCollected(610)| 
|----------------------|----------------------|
|2020-01-01 00:00:00.0 |2020-02-01 00:00:00.0 |
|----------------------|----------------------|
|----------------------|----------------------|
Run Code Online (Sandbox Code Playgroud)

Q1. java LocalDateTime 是用 mybatis LocalDateTimeTypeHandler 转换为 jdbc TIMESTAMP 吗?

Q2。mybatis LocalDateTimeTypeHandler 是否根据 jdbc servertimezone 设置转换值?

Q3。为什么我的2020-01-31T23:59:59.999999999值转换为2020-02-01 00:00:00.0?


ave*_*ave 7

  • A1。LocalDateTime不,MyBatis 从 3.5.1 版本开始就不再转换java.sql.Timestamp(不过在早期版本中是这样做的)。
  • A2。不,MyBatis 只是将值传递给驱动程序。您可以自己检查类型处理程序的实现。
    实际上是驱动程序执行转换,并且该行为被记录为跟踪器上的错误。
    https://bugs.mysql.com/bug.php?id=93444
  • A3。Java 的精度为纳秒(9 位数字),而LocalDateTimeMySQL 的TIME和只有微秒(6 位数字)精度。MySQL 文档中对您观察到的行为进行了解释。 DATETIMETIMESTAMP

    将带有秒小数部分的 TIME、DATE 或 TIMESTAMP 值插入到相同类型但小数位数较少的列中会导致四舍五入。