Rumah >Java >javaTutorial >Bagaimana untuk Memasukkan dan Mendapatkan Objek java.time.LocalDate daripada Pangkalan Data H2 menggunakan JDBC?

Bagaimana untuk Memasukkan dan Mendapatkan Objek java.time.LocalDate daripada Pangkalan Data H2 menggunakan JDBC?

Barbara Streisand
Barbara Streisandasal
2024-12-20 06:24:09800semak imbas

How to Insert and Retrieve java.time.LocalDate Objects from an H2 Database using JDBC?

Cara memasukkan dan mendapatkan semula objek java.time.LocalDate daripada pangkalan data SQL seperti H2

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:

  • Pemandu yang mematuhi JDBC 4.2: Jika anda Pemacu JDBC mematuhi spesifikasi JDBC 4.2 atau lebih baru, anda boleh berurusan terus dengan objek java.time.
  • Pemandu lama, sebelum JDBC 4.2: Jika pemandu JDBC anda tidak mematuhi JDBC 4.2 atau kemudian, anda mesti menukar secara ringkas objek java.time anda kepada jenis java.sql yang setara atau sebaliknya sebaliknya. Cari kaedah penukaran baharu yang ditambahkan pada kelas lama.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn