問題
どうすればよいですかJDBC を使用して、LocalDate などの java.time 型を H2 などの SQL データベースに挿入および取得しますか? PreparedStatement::setDate と ResultSet::getDate を使用する古い方法は従来の java.sql.Date 型に対して機能しますが、これらの面倒な古い日付/時刻クラスの使用は避けたいと考えています。 JDBC ドライバーを介して java.time 型を送信する最新の方法は何ですか?
解決策
JDBC を介して java.time オブジェクトを交換するには 2 つの方法があります。
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 サイトの他の関連記事を参照してください。