如何在没有JDBC 4.2驱动程序的情况下从java.sql.Timestamp获取java.time对象?旧类上的新方法无需转换

2022-09-01 09:37:58

当通过 JDBC 4.1 或更早版本从数据库中检索 java.sql.Timestamp 时,如何获取/转换为 java.time 对象?

Postgres的开源JDBC驱动程序都不符合JDBC 4.2标准,所以我正在寻找一种在JDBC 4.1中使用java.time的方法。


答案 1

旧类上的新方法

通过将驱动程序与 Java 8 及更高版本配合使用,您应该自动在 java.sql.Timestamp 对象上免费获取一些方法。java.sql.Timejava.sql.Date 都有类似的转换方法。

也就是说,要从java.sql转换为java.time,您正在寻找:

要从java.timejava.sql,请使用新的静态方法:

例:

preparedStatement.setTimestamp( 2, Timestamp.from(instant) );

答案 2

无需转换

正如其他人在评论中所说的那样,PostgreSQL的JDBC驱动程序现在支持JDBC 4.2,包括Java 8 Time API支持。我们可以直接与数据库交换 java.time 对象。

https://jdbc.postgresql.org/documentation/head/8-date-time.html

因此,无需转换,无需再次使用java.sql类型。在 java.time 包中仅使用它们的替换项,如此列表所示。

PostgreSQL™                      Java SE 8 (java.time)
DATE                             LocalDate
TIME [ WITHOUT TIMEZONE ]        LocalTime
TIMESTAMP [ WITHOUT TIMEZONE ]   LocalDateTime
TIMESTAMP WITH TIMEZONE          OffsetDateTime or Instant

这可以通过以下方式检索ResultSet::getObject

ResultSet rs = ...;
while (rs.next()) {
  LocalDate localDate = rs.getObject(1, LocalDate.class));
}

通过调用 来存储 java.time 对象。PreparedStatement::setObject

myPreparedStatement.setObject( … , myInstant ) ;