Java LocalDateTime преобразование с mybatis - PullRequest
0 голосов
/ 06 февраля 2020

Окружающая среда

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

JVM часовой пояс: Азия / Сеул


Мой тестовый запрос

SELECT # {from}, # {to}

Ввод

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

Case1. добавьте serverTimezone=UTC в jdb c url

Case1. Добавьте serverTimezone=Asia/Seoul в JDB c 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 |
|----------------------|----------------------|
|----------------------|----------------------|

Q1. java LocalDateTime конвертируется в jdb c TIMESTAMP с mybatis LocalDateTimeTypeHandler?

Q2. Mybatis LocalDateTimeTypeHandler преобразует значение, основанное на jdb c настройка серверного времени?

Q3. Почему мое значение 2020-01-31T23:59:59.999999999 преобразовано в 2020-02-01 00:00:00.0?


1 Ответ

1 голос
/ 06 февраля 2020
  • А1. Нет, MyBatis не преобразует LocalDateTime в java.sql.Timestamp начиная с версии 3.5.1 (хотя это было и в более ранних версиях).
  • A2. Нет, MyBatis просто передает значение драйверу. Вы можете проверить реализацию обработчика типа самостоятельно.
    Фактически это драйвер, который выполняет преобразование, и поведение регистрируется как ошибка на их трекере.
    https://bugs.mysql.com/bug.php?id=93444
  • A3. В то время как Java LocalDateTime имеет точность наносекунд (9 цифр), MySQL TIME, DATETIME и TIMESTAMP имеют точность только микросекунд (6 цифр). И поведение, которое вы наблюдали, объяснено в MySQL документации .

    Вставка значения TIME, DATE или TIMESTAMP с дробными секундами в столбец того же типа, но с меньшим количеством дробных цифр приводит к округлению.

...