Как получить объект java.time из java.sql.Timestamp без драйвера JDBC 4.2?
При извлечении java.sql.Timestamp из базы данных через JDBC 4.1 или ранее, как получить/преобразовать в java.time объект?
Ни один из драйверов JDBC с открытым исходным кодом для Postgres не совместим с JDBC 4.2, поэтому я ищу способ использования java.time с JDBC 4.1.
Ответы
Ответ 1
Новые методы в старых классах
Используя драйвер с Java 8 и более поздними версиями, вы должны автоматически выбрать некоторые методы на своем java.sql.Timestamp
объекте бесплатно. Оба java.sql.Time
и java.sql.Date
имеют похожие методы преобразования.
А именно, для преобразования из java.sql в java.time вы ищете:
Чтобы перейти в другое направление, от java.time до java.sql, используйте новые статические методы:
Пример:
preparedStatement.setTimestamp( 2, Timestamp.from(instant) );
Ответ 2
Нет необходимости конвертировать
Как уже говорили другие в комментариях, драйвер JDBC PostgreSQL теперь поддерживает JDBC 4.2, включая поддержку Java 8 Time API. Мы можем обмениваться объектами java.time напрямую с базой данных.
https://jdbc.postgresql.org/documentation/head/8-date-time.html
Так что нет необходимости конвертировать, нет необходимости снова использовать типы java.sql. Используйте только их замены в пакете java.time, как показано в этом списке.
PostgreSQL™ Java SE 8 (java.time)
DATE LocalDate
TIME [ WITHOUT TIMEZONE ] LocalTime
TIMESTAMP [ WITHOUT TIMEZONE ] LocalDateTime
TIMESTAMP WITH TIMEZONE OffsetDateTime or Instant
Это может быть получено через ResultSet::getObject
ResultSet rs = ...;
while (rs.next()) {
LocalDate localDate = rs.getObject(1, LocalDate.class));
}
Сохраните объект java.time, вызвав PreparedStatement::setObject
.
myPreparedStatement.setObject( … , myInstant ) ;