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

时间:2015-04-21 13:19:39

标签: java-8 resultset getdate java-time

无论如何从ResultSet获得java.time(Java 8中的新功能)兼容时间类吗?

我知道您可以使用ResultSet的{​​{1}}或getDate,但这些方法会返回getTimestamp / java.sql.Date个对象,现在这些对象已被弃用喜欢使用它们来创建java.sql.Timestamp或类似的不良做法。

3 个答案:

答案 0 :(得分:19)

大多数数据库供应商尚不支持JDBC 4.2。此specification表示将使用现有方法java.timeLocalDate支持setObject(...)类新getObject()类型。不需要和提供显式转换(无API更改)。

缺少支持的解决方法可以是Derby-mailing list上描述的手动转换。

类似的东西:

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

正如您所看到的,这些转化使用了不弃用的类型java.sql.Date等,另请参阅javadoc

答案 1 :(得分:16)

Timestamp

上的新方法

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

同样适用于Date& Time

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

答案 2 :(得分:0)

今天我们大多数人都在使用兼容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类型的对象。由于您要传递类型的对象,因此以这种方式不需要单独的类型参数。