Подтвердить что ты не робот

Получение даты из ResultSet для использования с java.time-классами

Есть ли способ получить java.time (новый в Java 8) совместимый временной класс из ResultSet?

Я знаю, что вы можете использовать ResultSet getDate или getTimestamp, но этот метод возвращает объекты java.sql.Date/java.sql.Timestamp, которые теперь устарели, поэтому для их использования кажется неправильной практикой для создания ZonedDateTime или тому подобное.

4b9b3361

Ответ 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. Поскольку вы передаете объект типа, при этом не требуется отдельный параметр типа.