web-dev-qa-db-ja.com

Java.timeクラスで使用するためにResultSetから日付を取得する

とにかく Java.time (新しいJava 8)互換の時間クラスをResultSetから取得しますか?

ResultSetgetDateまたはgetTimestampを使用できることは承知していますが、これらのメソッドはJava.sql.Date/Java.sql.Timestampオブジェクトを返しますZonedDateTimeまたは同様のものを作成するためにそれらを使用する練習。

20
Thomas Paulin

ほとんどのデータベースベンダーは JDBC 4.2 をまだサポートしていません。この 仕様 は、既存のメソッドsetObject(...)およびgetObject()を使用して、LocalDateのような新しい_Java.time_- typesがサポートされる/する必要があることを示しています。明示的な変換は必要なく、提供されません(APIの変更はありません)。

不足しているサポートの回避策は Derby-mailing list で説明されているように手動で変換することです。

何かのようなもの:

_LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();
_

ご覧のとおり、これらの変換では非推奨ではない型_Java.sql.Date_などが使用されています。 javadoc も参照してください。

20
Meno Hochschild

Timestampの新しいメソッド

Java 8には Java.sql.Timestamp Java.timeオブジェクトとの間で変換するクラス。これらの便利なメソッドは、JDBCドライバーを新しいデータ型用に更新できるようになるまでの暫定的な手段です。

同上DateTime

Java.sql.Date およびJava.sql.Timeクラスには、同様のJava.time変換メソッドがJava 8にも追加されています。

17
Basil Bourque

今日、私たちのほとんどは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型のオブジェクトも受け入れるようになりました。型のオブジェクトを渡す場合、この方法を実行するときに別の型パラメーターを使用する必要はありません。

4
Ole V.V.