Masalah
Bagaimana boleh anda memasukkan dan mendapatkan semula jenis java.time seperti LocalDate ke dalam pangkalan data SQL seperti H2 menggunakan JDBC? Kaedah lama menggunakan PreparedStatement::setDate dan ResultSet::getDate berfungsi untuk jenis java.sql.Date warisan, tetapi anda ingin mengelak daripada menggunakan kelas tarikh-masa lama yang menyusahkan ini. Apakah cara moden untuk menghantar jenis java.time melalui pemacu JDBC?
Penyelesaian
Terdapat dua cara untuk menukar objek java.time melalui JDBC:
Kelas masa masa lama seperti java.util.Date, java.util.Calendar dan rakan java.sql yang berkaitan seperti java. sql.Date terkenal dengan masalah, telah direka bentuk dengan pendekatan yang cacat dan digodam. Mereka mudah ralat, menyusahkan, dan mengelirukan. Elakkannya apabila boleh, kerana ia kini telah digantikan dengan kelas java.time.
Menggunakan pemacu yang mematuhi JDBC 4.2
Pemandu JDBC H2 terbina dalam (sehingga 2017-03) nampaknya mematuhi JDBC 4.2. Pemacu yang patuh mengetahui jenis java.time. Daripada menambah kaedah setLocalDate/getLocalDate, jawatankuasa JDBC menambah kaedah setObject/getObject.
Untuk menghantar data ke pangkalan data, hanya hantar objek java.time anda ke PreparedStatement::setObject. Jenis Java bagi hujah yang diluluskan anda dikesan oleh pemacu dan ditukar kepada jenis SQL yang sesuai. java.time.LocalDate ditukar kepada jenis SQL DATE. Lihat bahagian 22 dokumen PDF JDBC Maintenance Release 4.2 untuk senarai pemetaan ini.
myPreparedStatement.setObject(1, myLocalDate); // Automatic detection and conversion of data type.
Untuk mendapatkan semula data daripada pangkalan data, hubungi ResultSet::getObject. Daripada menghantar objek Objek yang terhasil, anda boleh memberikan hujah tambahan yang menyatakan Kelas jenis data yang anda harapkan untuk terima. Dengan menyatakan kelas yang dijangkakan secara eksplisit, anda memperoleh keselamatan jenis, yang disemak dan disahkan oleh IDE dan pengkompil anda.
LocalDate localDate = myResultSet.getObject("my_date_column_", LocalDate.class);
Contoh kod:
Berikut ialah contoh lengkap apl yang berfungsi yang memasukkan dan memilih nilai LocalDate ke dalam pangkalan data 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" ) );
Atas ialah kandungan terperinci Bagaimana untuk Memasukkan dan Mendapatkan Objek java.time.LocalDate daripada Pangkalan Data H2 menggunakan JDBC?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!