ホームページ >Java >&#&チュートリアル >データベース対話のために JDBC で java.time 型を効果的に使用する方法

データベース対話のために JDBC で java.time 型を効果的に使用する方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-24 19:06:14900ブラウズ

How to Effectively Use java.time Types with JDBC for Database Interactions?

LocalDate などの java.time 型を H2 などの SQL データベースに挿入およびフェッチする方法

PreparedStatement::setDate と ResultSet を使用する古い方法::getDate は従来の java.sql.Date 型に対して機能します。ただし、これらの面倒な古い日付時刻クラスの使用は避けた方がよいでしょう。代わりに、最新の java.time 型を使用してください。

JDBC 経由で java.time オブジェクトを交換するには 2 つのルートがあります:

JDBC 4.2 準拠のドライバー

JDBC ドライバーが準拠している場合JDBC 4.2 仕様以降では、java.time オブジェクトを直接処理できます。準拠ドライバーは java.time 型を認識しており、それらを処理する setObject/getObject メソッドを追加しています。

データをデータベースに送信するには、java.time オブジェクトを PreparedStatement::setObject に渡すだけです。渡された引数の Java 型はドライバーによって検出され、適切な SQL 型に変換されます。 Java LocalDate は SQL DATE 型に変換されます。

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

JDBC 4.2 より前の古いドライバー

JDBC ドライバーがまだ JDBC 4.2 に準拠していない場合、またはその後、java.time オブジェクトを同等の java.sql 型に、またはその逆に簡単に変換する必要があります。古いクラスに追加された新しい変換メソッドに注目してください。

これは、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" ) );
                preparedStatement.setObject ( 1 , today.minusDays ( 1 ) );  // Yesterday.
                preparedStatement.executeUpdate ( );
                preparedStatement.setObject ( 1, today );                  // Today.
                preparedStatement.executeUpdate ( );
                preparedStatement.setObject ( 1, today.plusDays ( 1 ) );   // Tomorrow.
                preparedStatement.executeUpdate ( );
            }
            // Query all.
            sql = "SELECT * FROM test_";
            try ( ResultSet rs = stmt.executeQuery ( sql ) ; ) {
                while ( rs.next ( ) ) {
                    UUID id = rs.getObject ( "id_" , UUID.class );  // Pass the class to be type-safe.
                    LocalDate localDate = rs.getObject ( "date_", LocalDate.class );  // Pass class for type-safety.
                    System.out.println ( "id_: " + id + " | date_: " + localDate );
                }
            }
        } catch ( SQLException e ) {
            e.printStackTrace ( );
        }
    }
}

以上がデータベース対話のために JDBC で java.time 型を効果的に使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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