如何在没有JDBC 4.2驱动程序的情况下从java.sql.Timestamp获取java.time对象?旧类上的新方法无需转换
当通过 JDBC 4.1 或更早版本从数据库中检索 java.sql.Timestamp 时,如何获取/转换为 java.time 对象?
Postgres的开源JDBC驱动程序都不符合JDBC 4.2标准,所以我正在寻找一种在JDBC 4.1中使用java.time的方法。
当通过 JDBC 4.1 或更早版本从数据库中检索 java.sql.Timestamp 时,如何获取/转换为 java.time 对象?
Postgres的开源JDBC驱动程序都不符合JDBC 4.2标准,所以我正在寻找一种在JDBC 4.1中使用java.time的方法。
通过将驱动程序与 Java 8 及更高版本配合使用,您应该自动在 java.sql.Timestamp
对象上免费获取一些方法。java.sql.Time
和 java.sql.Date
都有类似的转换方法。
也就是说,要从java.sql转换为java.time,您正在寻找:
要从java.time到java.sql,请使用新的静态方法:
Timestamp.from(instant)
Timestamp.valueOf(localDateTime)
Date.valueOf(localDate)
Time.valueOf(localTime)
例:
preparedStatement.setTimestamp( 2, Timestamp.from(instant) );
正如其他人在评论中所说的那样,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 ) ;