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



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

我知道您可以使用ResultSetgetDategetTimestamp,但这些方法返回的java.sql.Date/java.sql.Timestamp对象现在已被弃用,因此使用它们来创建ZonedDateTime或类似对象似乎是一种糟糕的做法。

大多数数据库供应商还不支持JDBC 4.2。该规范指出,将/应该使用现有的方法setObject(...)getObject()来支持像LocalDate这样的新的java.time类型。不需要也不提供显式转换(无API更改)。

缺少支持的解决方法可以是手动转换,如Derby邮件列表中所述。

类似于:

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

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

如今,我们大多数人都在使用符合JDBC 4.2的驱动程序,与2015年的答案相比,这大大改善了这种情况。

要从结果集中获得LocalDate

LocalDate dateFromDatabase = yourResultSet.getObject(yourColumnIndex, LocalDate.class);

LocalDate dateFromDatabase = yourResultSet.getObject("yourColumnLabel", LocalDate.class);

ResultSet中没有添加新的方法使其工作。CCD_ 15方法一直存在。新的事情是,自从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类型的对象。由于您传递的是一个类型的对象,因此在执行此操作时不需要单独的类型参数。

Timestamp上的新方法

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

  • toInstant
  • toLocalDateTime
  • valueOf
  • from

同上,适用于Date&Time

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

相关内容

  • 没有找到相关文章

最新更新