从 ResultSet 获取日期以用于 java.time 类

Getting the date from a ResultSet for use with java.time classes

有没有办法从 ResultSet 中获得 java.time(Java 8 中的新功能)兼容时间 class?

我知道您可以使用 ResultSetgetDategetTimestamp 但是这些方法 return java.sql.Date / java.sql.Timestamp 对象现在已弃用,因此使用它们来创建 ZonedDateTime 或类似的东西似乎是不好的做法。

大多数数据库供应商不支持 JDBC 4.2 yet. This specification 表示使用现有方法支持新的 java.time 类型,例如 LocalDate will/should setObject(...)getObject()。不需要和提供显式转换(无 API-更改)。

缺少支持的解决方法是手动转换,如 Derby-mailing list 中所述。

类似于:

LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();

如您所见,这些转换使用了未弃用的类型 java.sql.Date 等,另请参阅 javadoc.

Timestamp

上的新方法

Java 8 包括 java.sql.Timestamp class 上的新方法,用于与 java.time 对象相互转换。在可以为新数据类型更新 JDBC 驱动程序之前,这些便捷方法是一种权宜之计。

同上 Date & Time

java.sql.Datejava.sql.Time classes 在 Java 8 中也添加了类似的 java.time 转换方法。

今天我们大多数人都在使用 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 作为第二个参数和 returns 一个 LocalDate。当查询 returns 具有 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 类型的对象。由于您传递的是一个类型的对象,因此这样做时不需要单独的类型参数。