ホームページ >Java >&#&チュートリアル >JDBC を使用して H2 データベースに java.time.LocalDate オブジェクトを挿入および取得する方法

JDBC を使用して H2 データベースに java.time.LocalDate オブジェクトを挿入および取得する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-12-20 06:24:09836ブラウズ

How to Insert and Retrieve java.time.LocalDate Objects from an H2 Database using JDBC?

H2 のような SQL データベースに java.time.LocalDate オブジェクトを挿入および取得する方法

問題

どうすればよいですかJDBC を使用して、LocalDate などの java.time 型を H2 などの SQL データベースに挿入および取得しますか? PreparedStatement::setDate と ResultSet::getDate を使用する古い方法は従来の java.sql.Date 型に対して機能しますが、これらの面倒な古い日付/時刻クラスの使用は避けたいと考えています。 JDBC ドライバーを介して java.time 型を送信する最新の方法は何ですか?

解決策

JDBC を介して java.time オブジェクトを交換するには 2 つの方法があります。

  • JDBC 4.2 準拠ドライバー: JDBC ドライバーは JDBC 4.2 仕様以降に準拠しているため、java.time オブジェクトを直接処理できます。
  • JDBC 4.2 より前の古いドライバー: JDBC ドライバーが JDBC 4.2 に準拠していない場合以降では、java.time オブジェクトを同等の java.sql 型に、またはその逆に簡単に変換する必要があります。古いクラスに追加された新しい変換メソッドを探してください。

java.util.Date、java.util.Calendar などの従来の日付/時間クラス、および java などの関連する java.sql クラス。 sql.Date は、欠陥のあるハッキングされたアプローチで設計されているため、問題があることで有名です。これらは間違いが発生しやすく、面倒で、混乱を招きます。これらは java.time クラスに置き換えられているため、可能な限り避けてください。

JDBC 4.2 準拠ドライバーの使用

組み込みの H2 JDBC ドライバー (現在) 2017-03)はJDBC 4.2に準拠しているようです。準拠したドライバーは java.time 型を認識します。 JDBC 委員会は、setLocalDate/getLocalDate メソッドを追加する代わりに、setObject/getObject メソッドを追加しました。

データベースにデータを送信するには、java.time オブジェクトを PreparedStatement::setObject に渡すだけです。渡された引数の Java 型はドライバーによって検出され、適切な SQL 型に変換されます。 java.time.LocalDate は SQL DATE 型に変換されます。これらのマッピングのリストについては、JDBC メンテナンス リリース 4.2 PDF ドキュメントのセクション 22 を参照してください。

myPreparedStatement.setObject(1, myLocalDate); // Automatic detection and conversion of data type.

データベースからデータを取得するには、ResultSet::getObject を呼び出します。結果の Object オブジェクトをキャストするのではなく、受信するデータ型のクラスを指定する追加の引数を指定できます。予期されるクラスを明示的に指定することで、タイプ セーフが得られ、IDE とコンパイラによってチェックおよび検証されます。

LocalDate localDate = myResultSet.getObject("my_date_column_", LocalDate.class);

コード例:

ここにあります。 LocalDate 値を H2 データベースに挿入および選択するアプリの完全な動作例:

import java.sql.*;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.UUID;

public class App {
    public static void main ( String[] args ) {
        App app = new App ( );
        app.doIt ( );
    }

    private void doIt ( ) {
        try {
            Class.forName ( "org.h2.Driver" );
        } catch ( ClassNotFoundException e ) {
            e.printStackTrace ( );
        }

        try (
                Connection conn = DriverManager.getConnection ( "jdbc:h2:mem:trash_me_db_" ) ;
                Statement stmt = conn.createStatement ( ) ;
        ) {
            String tableName = "test_";
            String sql = "CREATE TABLE " + tableName + " (\n" +
                    "  id_ UUID DEFAULT random_uuid() PRIMARY KEY ,\n" +
                    "  date_ DATE NOT NULL\n" +
                    ");";
            stmt.execute ( sql );

            // Insert row.
            sql = "INSERT INTO test_ ( date_ ) " + "VALUES (?) ;";
            try ( PreparedStatement preparedStatement = conn.prepareStatement ( sql ) ; ) {
                LocalDate today = LocalDate.now ( ZoneId.of ( "America/Montreal" ) );

以上がJDBC を使用して H2 データベースに java.time.LocalDate オブジェクトを挿入および取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。