有没有办法从ResultSet中获得与java.time (Java8中的新特性)兼容的time类?
我知道您可以使用ResultSet的getDate或getTimestamp,但这些方法返回的java.sql.Date / java.sql.Timestamp对象现在已被弃用,因此使用它们来创建ZonedDateTime或类似的对象似乎是一种不好的做法。
发布于 2015-04-21 21:58:33
大多数数据库供应商还不支持JDBC 4.2。这个specification说,像LocalDate这样的新java.time-types将/应该使用现有的方法setObject(...)和getObject()来支持。不需要并提供显式转换(无API更改)。
缺少支持的解决方法可以手动转换,如Derby-mailing list中所述。
类似于:
LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();正如你所看到的,这些转换使用了不推荐使用的java.sql.Date等类型,另请参阅javadoc。
发布于 2015-04-22 01:19:01
关于Timestamp的新方法
Java8在java.sql.Timestamp类上包含了与java.time对象相互转换的新方法。在为新的数据类型更新JDBC驱动程序之前,这些方便的方法是权宜之计。
toInstanttoLocalDateTimevalueOffromDate和Time也是如此
java.sql.Date和java.sql.Time类也在Java8中添加了类似的java.time转换方法。
发布于 2019-02-27 22:17:52
今天我们中的大多数人都在使用JDBC 4.2兼容的驱动程序,与2015年的答案相比,这种情况有了很大的改善。
要从结果集中获取LocalDate,请执行以下操作:
LocalDate dateFromDatabase = yourResultSet.getObject(yourColumnIndex, LocalDate.class);或
LocalDate dateFromDatabase = yourResultSet.getObject("yourColumnLabel", LocalDate.class);ResultSet中还没有添加新的方法来使其正常工作。getObject方法一直存在。新特性是,从JDBC4.2开始,它接受LocalDate.class作为第二个参数并返回一个LocalDate。当查询返回数据类型为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类型的对象。由于您传递的是一个类型的对象,因此在执行此操作时不需要单独的类型参数。
https://stackoverflow.com/questions/29773390
复制相似问题