ホームページ >データベース >mysql チュートリアル >JDBC を使用して、Postgres または H2 データベースに Java `java.time` オブジェクトを効率的に挿入および取得するにはどうすればよいですか?

JDBC を使用して、Postgres または H2 データベースに Java `java.time` オブジェクトを効率的に挿入および取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-22 01:42:08648ブラウズ

JDBC を効率的に使用して Java を操作しますjava.timeオブジェクトは PostgreSQL または H2 データベースと対話します

How can I efficiently insert and retrieve Java `java.time` objects into and from a Postgres or H2 database using JDBC?

この記事では、JDBC を効率的に使用して、PostgreSQL または H2 データベースで java.time などの Java LocalDate オブジェクトを挿入および取得する方法について説明します。

従来の方法: PreparedStatement::setDateResultSet::getDate

を使用します。

従来のアプローチは、廃止された java.sql.Date 型に依存し、操作に PreparedStatement::setDateResultSet::getDate を使用します。ただし、これらの問題を回避するには、最新の方法をお勧めします。

最新のアプローチ: java.time

の直接操作

JDBC 4.2 以降と互換性のあるドライバー

最も効果的な方法は、JDBC 4.2 以降と互換性のあるドライバーを使用することです。これらのドライバーは、型変換せずに java.time オブジェクトを直接サポートします。

データの挿入: PreparedStatement::setObject(1, myLocalDate) を使用します。myLocalDateLocalDate オブジェクト インスタンスです。ドライバーは自動的に検出し、適切な SQL タイプに変換します。

データの取得: ResultSet::getObject("my_date_column_", LocalDate.class) オブジェクトを取得するには、LocalDate を使用します。予期されるクラスを指定すると、型の安全性が確保されます。

レガシードライバー (JDBC 4.2 以下)

JDBC 4.2 以降と互換性のないドライバーの場合は、java.time オブジェクトを同等の java.sql 型に一時的に変換する必要があります (逆も同様)。

java.sql.Date.valueOf(myLocalDate)LocalDate に変換するには、java.sql.Date を使用します。

データを挿入: preparedStatement.setDate(1, java.sql.Date.valueOf(myLocalDate)) を使用します。

データの取得: rs.getDate(1) を使用して java.sql.Date オブジェクトを取得し、sqlDate.toLocalDate() を使用してそれを LocalDate に変換します。

JDBC 4.2 互換ドライバーを使用したサンプルコード

<code class="language-java">import java.sql.*;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.UUID;

public class App {

    public static void main(String[] args) {
        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 + " (" +
                    "id_ UUID DEFAULT random_uuid() PRIMARY KEY ," +
                    "date_ DATE NOT NULL" +
                    ");";
            stmt.execute(sql);

            sql = "INSERT INTO test_ (date_) VALUES (?) ;";
            try (PreparedStatement preparedStatement = conn.prepareStatement(sql);) {
                LocalDate today = LocalDate.now(ZoneId.of("America/Montreal"));
                preparedStatement.setObject(1, today.minusDays(1));
                preparedStatement.executeUpdate();
                preparedStatement.setObject(1, today);
                preparedStatement.executeUpdate();
                preparedStatement.setObject(1, today.plusDays(1));
                preparedStatement.executeUpdate();
            }

            sql = "SELECT * FROM test_";
            try (ResultSet rs = stmt.executeQuery(sql);) {
                while (rs.next()) {
                    UUID id = rs.getObject("id_", UUID.class);
                    LocalDate localDate = rs.getObject("date_", LocalDate.class);
                    System.out.println("id_: " + id + " | date_: " + localDate);
                }
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}</code>

実行結果は次のようになります:

<code>id_: e856a305-41a1-45fa-ab69-cfa676285461 | date_: 2017-03-26
id_: a4474e79-3e1f-4395-bbba-044423b37b9f | date_: 2017-03-27
id_: 5d47bc3d-ebfa-43ab-bbc2-7bb2313b33b0 | date_: 2017-03-28</code>

古いバージョンのドライバーを使用したサンプル コード (元のコードと同じなので、ここでは繰り返しません)

適切な JDBC ドライバーを選択し、適切なメソッドを使用することで、データベースとの効率的かつタイプセーフな対話を確保できます。 コードを簡素化し効率を向上させるために、JDBC 4.2 以降と互換性のあるドライバーの使用を優先してください。

以上がJDBC を使用して、Postgres または H2 データベースに Java `java.time` オブジェクトを効率的に挿入および取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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