无论如何从ResultSet
获得java.time(Java 8中的新功能)兼容时间类吗?
我知道您可以使用ResultSet
的{{1}}或getDate
,但这些方法会返回getTimestamp
/ java.sql.Date
个对象,现在这些对象已被弃用喜欢使用它们来创建java.sql.Timestamp
或类似的不良做法。
答案 0 :(得分:19)
大多数数据库供应商尚不支持JDBC 4.2。此specification表示将使用现有方法java.time
和LocalDate
支持setObject(...)
类新getObject()
类型。不需要和提供显式转换(无API更改)。
缺少支持的解决方法可以是Derby-mailing list上描述的手动转换。
类似的东西:
LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();
正如您所看到的,这些转化使用了不弃用的类型java.sql.Date
等,另请参阅javadoc。
答案 1 :(得分:16)
Timestamp
Java 8包含java.sql.Timestamp
类的新方法,用于转换为java.time对象和从java.time对象转换。这些便捷方法是一种权宜之计,直到可以针对新数据类型更新JDBC驱动程序。
Date
& Time
java.sql.Date
和java.sql.Time
类在Java 8中也添加了类似的java.time转换方法。
答案 2 :(得分:0)
今天我们大多数人都在使用兼容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
作为第二个参数并返回一个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类型的对象。由于您要传递类型的对象,因此以这种方式不需要单独的类型参数。