【问题标题】:Java LocalDateTime conversioning with mybatisJava LocalDateTime 与 mybatis 的转换
【发布时间】:2020-02-06 05:36:25
【问题描述】:

环境

  • mybatis-spring-boot-starter 2.0.1
  • mybatis 3.5.1
  • mybatis-spring 2.0.1
  • mysql-connector-java 8.0.16

jvm 时区:亚洲/首尔


我的测试查询

选择#{从},#{到}

输入

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

案例 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 |
|----------------------|----------------------|
|----------------------|----------------------|
[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 |
|----------------------|----------------------|
|----------------------|----------------------|

第一季度。 java LocalDateTime是用mybatis LocalDateTimeTypeHandler转成jdbc TIMESTAMP的吗?

第二季度。 mybatis LocalDateTimeTypeHandler 是否根据 jdbc servertimezone 设置转换值?

第三季度。为什么我的2020-01-31T23:59:59.999999999 值转换为2020-02-01 00:00:00.0


【问题讨论】:

  • 你的列的数据类型到底是什么?
  • @Basil Bourque 我是datetime

标签: java mysql datetime mybatis


【解决方案1】:
  • A1。不,MyBatis 从 3.5.1 版本开始不会将 LocalDateTime 转换为 java.sql.Timestamp(不过在早期版本中会这样做)。
  • A2。不,MyBatis 只是将值传递给驱动程序。您可以自己查看type handler implementation
    它实际上是执行转换的驱动程序,并且该行为在其跟踪器上被归档为错误。
    https://bugs.mysql.com/bug.php?id=93444
  • A3。虽然 Java 的 LocalDateTime 具有纳秒(9 位)精度,但 MySQL 的 TIMEDATETIMETIMESTAMP 仅具有微秒(6 位)精度。您观察到的行为在MySQL documentation 中进行了解释。

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

【讨论】:

  • A1 点真的很有帮助!感谢您简短而清晰的解释。
猜你喜欢
  • 2021-11-26
  • 2019-01-21
  • 2020-05-19
  • 2016-01-06
  • 2016-04-10
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多