从 ResultSet 获取日期以用于 java.time 类
Getting the date from a ResultSet for use with java.time classes
有没有办法从 ResultSet
中获得 java.time(Java 8 中的新功能)兼容时间 class?
我知道您可以使用 ResultSet
的 getDate
或 getTimestamp
但是这些方法 return java.sql.Date
/ java.sql.Timestamp
对象现在已弃用,因此使用它们来创建 ZonedDateTime
或类似的东西似乎是不好的做法。
大多数数据库供应商不支持 JDBC 4.2 yet. This specification 表示使用现有方法支持新的 java.time
类型,例如 LocalDate
will/should setObject(...)
和 getObject()
。不需要和提供显式转换(无 API-更改)。
缺少支持的解决方法是手动转换,如 Derby-mailing list 中所述。
类似于:
LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();
如您所见,这些转换使用了未弃用的类型 java.sql.Date
等,另请参阅 javadoc.
Timestamp
上的新方法
Java 8 包括 java.sql.Timestamp
class 上的新方法,用于与 java.time 对象相互转换。在可以为新数据类型更新 JDBC 驱动程序之前,这些便捷方法是一种权宜之计。
同上 Date
& Time
java.sql.Date
和 java.sql.Time
classes 在 Java 8 中也添加了类似的 java.time 转换方法。
今天我们大多数人都在使用 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
作为第二个参数和 returns 一个 LocalDate
。当查询 returns 具有 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 类型的对象。由于您传递的是一个类型的对象,因此这样做时不需要单独的类型参数。
有没有办法从 ResultSet
中获得 java.time(Java 8 中的新功能)兼容时间 class?
我知道您可以使用 ResultSet
的 getDate
或 getTimestamp
但是这些方法 return java.sql.Date
/ java.sql.Timestamp
对象现在已弃用,因此使用它们来创建 ZonedDateTime
或类似的东西似乎是不好的做法。
大多数数据库供应商不支持 JDBC 4.2 yet. This specification 表示使用现有方法支持新的 java.time
类型,例如 LocalDate
will/should setObject(...)
和 getObject()
。不需要和提供显式转换(无 API-更改)。
缺少支持的解决方法是手动转换,如 Derby-mailing list 中所述。
类似于:
LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();
如您所见,这些转换使用了未弃用的类型 java.sql.Date
等,另请参阅 javadoc.
Timestamp
上的新方法
Java 8 包括 java.sql.Timestamp
class 上的新方法,用于与 java.time 对象相互转换。在可以为新数据类型更新 JDBC 驱动程序之前,这些便捷方法是一种权宜之计。
同上 Date
& Time
java.sql.Date
和 java.sql.Time
classes 在 Java 8 中也添加了类似的 java.time 转换方法。
今天我们大多数人都在使用 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
作为第二个参数和 returns 一个 LocalDate
。当查询 returns 具有 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 类型的对象。由于您传递的是一个类型的对象,因此这样做时不需要单独的类型参数。