首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从用于java.time类的ResultSet获取日期

从用于java.time类的ResultSet获取日期
EN

Stack Overflow用户
提问于 2015-04-21 21:19:39
回答 3查看 25K关注 0票数 28

有没有办法从ResultSet中获得与java.time (Java8中的新特性)兼容的time类?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-21 21:58:33

大多数数据库供应商还不支持JDBC 4.2。这个specification说,像LocalDate这样的新java.time-types将/应该使用现有的方法setObject(...)getObject()来支持。不需要并提供显式转换(无API更改)。

缺少支持的解决方法可以手动转换,如Derby-mailing list中所述。

类似于:

代码语言:javascript
复制
LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();

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

票数 25
EN

Stack Overflow用户

发布于 2015-04-22 01:19:01

关于Timestamp的新方法

Java8在java.sql.Timestamp类上包含了与java.time对象相互转换的新方法。在为新的数据类型更新JDBC驱动程序之前,这些方便的方法是权宜之计。

  • toInstant
  • toLocalDateTime
  • valueOf
  • from

DateTime也是如此

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

票数 19
EN

Stack Overflow用户

发布于 2019-02-27 22:17:52

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

要从结果集中获取LocalDate,请执行以下操作:

代码语言:javascript
复制
    LocalDate dateFromDatabase = yourResultSet.getObject(yourColumnIndex, LocalDate.class);

代码语言:javascript
复制
    LocalDate dateFromDatabase = yourResultSet.getObject("yourColumnLabel", LocalDate.class);

ResultSet中还没有添加新的方法来使其正常工作。getObject方法一直存在。新特性是,从JDBC4.2开始,它接受LocalDate.class作为第二个参数并返回一个LocalDate。当查询返回数据类型为date的列时,上述方法有效(实际上,JDBC类型也适用,但它们往往是一致的)。

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

代码语言:javascript
复制
    OffsetDateTime dateTimeFromDatabase
            = yourResultSet.getObject(yourTimestampWithTimeZoneColumnIndex, OffsetDateTime.class);

要使用的java.time类型包括:

代码语言:javascript
复制
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类型的对象。由于您传递的是一个类型的对象,因此在执行此操作时不需要单独的类型参数。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29773390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档