如何在没有JDBC 4.2驱动程序的情况下从java.sql.Timestamp获取java.time对象?
通过JDBC 4.1或更早版本从数据库中检索java.sql.Timestamp时 ,如何获取/转换为java.time对象?
Postgres的开源JDBC驱动程序都没有兼容JDBC 4.2,所以我正在寻找一种方法来使用java.time和JDBC 4.1。
旧类的新方法
通过在Java 8及更高版本中使用驱动程序,您应该自动在java.sql.Timestamp
对象上选择一些方法。 java.sql.Time
和java.sql.Date
都有类似的转换方法。
也就是说,要从java.sql转换为java.time,您正在寻找:
-
Timestamp::toInstant()
-
Timestamp::toLocalDateTime()
-
Date::toLocalDate()
-
Time::toLocalTime()
要从另一个方向,从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)); }
通过调用PreparedStatement::setObject
存储java.time对象。
myPreparedStatement.setObject( … , myInstant ) ;