有没有办法从ResultSet
中获得java.time(java 8中的新)兼容的时间类?
我知道您可以使用ResultSet
的getDate
或getTimestamp
,但这些方法返回的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.Date
和java.sql.Time
类在Java8中也添加了类似的java.time转换方法。