とにかく Java.time (新しいJava 8)互換の時間クラスをResultSet
から取得しますか?
ResultSet
のgetDate
またはgetTimestamp
を使用できることは承知していますが、これらのメソッドはJava.sql.Date
/Java.sql.Timestamp
オブジェクトを返しますZonedDateTime
または同様のものを作成するためにそれらを使用する練習。
ほとんどのデータベースベンダーは JDBC 4.2 をまだサポートしていません。この 仕様 は、既存のメソッドsetObject(...)
およびgetObject()
を使用して、LocalDate
のような新しい_Java.time
_- typesがサポートされる/する必要があることを示しています。明示的な変換は必要なく、提供されません(APIの変更はありません)。
不足しているサポートの回避策は Derby-mailing list で説明されているように手動で変換することです。
何かのようなもの:
_LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();
_
ご覧のとおり、これらの変換では非推奨ではない型_Java.sql.Date
_などが使用されています。 javadoc も参照してください。
Timestamp
の新しいメソッドJava 8には Java.sql.Timestamp
Java.timeオブジェクトとの間で変換するクラス。これらの便利なメソッドは、JDBCドライバーを新しいデータ型用に更新できるようになるまでの暫定的な手段です。
Date
&Time
Java.sql.Date
およびJava.sql.Time
クラスには、同様のJava.time変換メソッドがJava 8にも追加されています。
今日、私たちのほとんどはJDBC 4.2準拠のドライバーを使用しています。これにより、2015年の回答に比べて状況がかなり改善されます。
結果セットからLocalDate
を取得するには:
LocalDate dateFromDatabase = yourResultSet.getObject(yourColumnIndex, LocalDate.class);
または
LocalDate dateFromDatabase = yourResultSet.getObject("yourColumnLabel", LocalDate.class);
これが機能するための新しいメソッドはResultSet
に追加されていません。 getObject
メソッドは常に存在していました。新しいことは、JDBC 4.2以降、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型のオブジェクトも受け入れるようになりました。型のオブジェクトを渡す場合、この方法を実行するときに別の型パラメーターを使用する必要はありません。