从ResultSet获取日期以与java.time类一起使用

Tho*_*lin 18 resultset getdate java-8 java-time

反正有没有得到一个java.time(Java 8中新的)兼容时间类ResultSet

我知道你可以使用ResultSet's getDate或者getTimestamp这些方法返回java.sql.Date/ java.sql.Timestamp对象现在已被弃用,所以使用它们来创建一个ZonedDateTime或类似的似乎是不好的做法.

Men*_*ild 20

大多数数据库供应商尚不支持JDBC 4.2.该规范表明,使用现有方法和/应该支持新的java.time类型.不需要和提供显式转换(无API更改).LocalDatesetObject(...)getObject()

缺少支持的解决方法可以是Derby-mailing列表中描述的手动转换.

就像是:

LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();
Run Code Online (Sandbox Code Playgroud)

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


Bas*_*que 18

新方法 Timestamp

Java 8包含java.sql.Timestamp要在java.time对象之间进行转换的类的新方法.这些便捷方法是一种权宜之计,直到可以针对新数据类型更新JDBC驱动程序.

Ditto For Date&Time

java.sql.Datejava.sql.Time班有在Java中添加8以及类似java.time转换方法.


Ole*_*.V. 5

今天,我们大多数人都在使用兼容JDBC 4.2的驱动程序,与2015年的答案相比,它可以大大改善这种情况。

要从LocalDate结果集中获取:

    LocalDate dateFromDatabase = yourResultSet.getObject(yourColumnIndex, LocalDate.class);
Run Code Online (Sandbox Code Playgroud)

要么

    LocalDate dateFromDatabase = yourResultSet.getObject("yourColumnLabel", LocalDate.class);
Run Code Online (Sandbox Code Playgroud)

尚未添加新方法以ResultSet使其正常工作。该getObject方法一直存在。从JDBC 4.2开始,新的东西是它接受LocalDate.class作为第二个参数并返回一个LocalDate。当查询返回具有SQL数据类型的列date(确实是JDBC类型计数,但它们倾向于一致)时,以上方法起作用。

您也可以传递其他java.time类型的类。并获取对应的类型。例如:

    OffsetDateTime dateTimeFromDatabase
            = yourResultSet.getObject(yourTimestampWithTimeZoneColumnIndex, OffsetDateTime.class);
Run Code Online (Sandbox Code Playgroud)

要使用的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
Run Code Online (Sandbox Code Playgroud)

为了通过另一种方式传递,从Java到数据库(用作查询参数或用于存储)PreparedStatement.setObject现在也接受上述java.time类型的对象。由于您要传递类型的对象,因此以这种方式不需要单独的类型参数。