Получение даты из ResultSet для использования с java.time-классами
Есть ли способ получить java.time (новый в Java 8) совместимый временной класс из ResultSet
?
Я знаю, что вы можете использовать ResultSet
getDate
или getTimestamp
, но этот метод возвращает объекты java.sql.Date
/java.sql.Timestamp
, которые теперь устарели, поэтому для их использования кажется неправильной практикой для создания ZonedDateTime
или тому подобное.
Ответы
Ответ 1
Большинство поставщиков баз данных еще не поддерживают JDBC 4.2. Эта спецификация списке рассылки Derby.
Что-то вроде:
LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();
Как вы можете видеть, эти преобразования используют не-устаревшие типы java.sql.Date
и т.д., см. также javadoc.
Ответ 2
Новые методы Вкл Timestamp
Java 8 включает новые методы в классе java.sql.Timestamp
для преобразования в объекты java.time и из них. Эти удобные методы представляют собой меру остановки, пока драйверы JDBC не могут быть обновлены для новых типов данных.
Ditto Для Date
и Time
Классы java.sql.Date
и java.sql.Time
имеют аналогичные методы преобразования java.time, добавленные также в Java 8.
Ответ 3
Сегодня большинство из нас использует драйверы, совместимые с JDBC 4.2, что несколько улучшает ситуацию по сравнению с ответами 2015 года.
Чтобы получить LocalDate
из вашего набора результатов:
LocalDate dateFromDatabase = yourResultSet.getObject(yourColumnIndex, LocalDate.class);
или
LocalDate dateFromDatabase = yourResultSet.getObject("yourColumnLabel", LocalDate.class);
Новый метод не был добавлен в ResultSet
, чтобы это работало. Метод getObject
был там все время. Новым является то, что начиная с JDBC 4.2 он принимает LocalDate.class
в качестве второго аргумента и возвращает LocalDate
. Вышеописанное работает, когда запрос возвращает столбец с типом данных SQL date
(на самом деле тип JDBC имеет значение, но они, как правило, согласуются).
Вы также можете передавать классы других типов java.time. И получите соответствующий тип обратно. Например:
OffsetDateTime dateTimeFromDatabase
= yourResultSet.getObject(yourTimestampWithTimeZoneColumnIndex, OffsetDateTime.class);
Используемые типы java.time:
SQL datatype | java.time type
------------------------+-----------------------------------------------------------
date | LocalDate
time | LocalTime
timestamp | LocalDateTime
timestamp with timezone | Officially OffsetDateTime; many drivers accept Instant too
time with timezone | OffsetTime
Для передачи другого пути из Java в базу данных (для использования в качестве параметров запроса или для хранения) PreparedStatement.setObject
теперь также принимает объекты вышеуказанных типов java.time. Поскольку вы передаете объект типа, при этом не требуется отдельный параметр типа.