Gunakan JDBC dengan cekap untuk mengendalikan Java java.time
Objek berinteraksi dengan pangkalan data PostgreSQL atau H2
Artikel ini meneroka cara menggunakan JDBC dengan cekap untuk memasukkan dan mendapatkan semula objek Java java.time
, seperti LocalDate
, dalam pangkalan data PostgreSQL atau H2.
Kaedah tradisional: gunakan PreparedStatement::setDate
dan ResultSet::getDate
Pendekatan tradisional bergantung pada jenis java.sql.Date
usang, menggunakan PreparedStatement::setDate
dan ResultSet::getDate
untuk operasi. Walau bagaimanapun, untuk mengelakkan masalah ini, kaedah moden disyorkan.
Pendekatan moden: manipulasi langsung java.time
jenis
Pemandu serasi dengan JDBC 4.2 dan ke atas
Kaedah yang paling berkesan ialah menggunakan pemandu yang serasi dengan JDBC 4.2 dan ke atas. Pemacu ini menyokong java.time
objek secara langsung, tanpa penukaran jenis.
Sisipkan data: gunakan PreparedStatement::setObject(1, myLocalDate)
, dengan myLocalDate
ialah contoh objek LocalDate
. Pemacu secara automatik mengesan dan menukar kepada jenis SQL yang sesuai.
Dapatkan semula data: Gunakan ResultSet::getObject("my_date_column_", LocalDate.class)
untuk mendapatkan semula LocalDate
objek. Menentukan kelas yang dijangka memastikan keselamatan jenis.
Pemandu lama (di bawah JDBC 4.2)
Untuk pemandu yang tidak serasi dengan JDBC 4.2 dan ke atas, anda perlu menukar objek java.time
kepada jenis java.sql
yang setara dan sebaliknya.
Gunakan java.sql.Date.valueOf(myLocalDate)
untuk menukar LocalDate
kepada java.sql.Date
.
Sisipkan data: gunakan preparedStatement.setDate(1, java.sql.Date.valueOf(myLocalDate))
.
Dapatkan data: Gunakan rs.getDate(1)
untuk mendapatkan objek java.sql.Date
, kemudian gunakan sqlDate.toLocalDate()
untuk menukarnya kepada LocalDate
.
Contoh kod menggunakan pemacu serasi 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>
Hasil larian adalah serupa dengan:
<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>
Contoh kod menggunakan versi lama pemandu (Sama seperti kod asal dan tidak akan diulang di sini)
Dengan memilih pemacu JDBC yang betul dan menggunakan kaedah yang sesuai, anda boleh memastikan interaksi yang cekap dan selamat jenis dengan pangkalan data anda. Ingat untuk mengutamakan penggunaan pemacu yang serasi dengan JDBC 4.2 dan ke atas untuk memudahkan kod dan meningkatkan kecekapan.
Atas ialah kandungan terperinci Bagaimanakah saya boleh memasukkan dan mendapatkan semula objek Java `java.time` dengan cekap ke dalam dan dari pangkalan data Postgres atau H2 menggunakan JDBC?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!