首頁 >資料庫 >mysql教程 >如何使用 JDBC 在 Postgres 或 H2 資料庫中高效率插入和檢索 Java `java.time` 物件?

如何使用 JDBC 在 Postgres 或 H2 資料庫中高效率插入和檢索 Java `java.time` 物件?

Susan Sarandon
Susan Sarandon原創
2025-01-22 01:42:08648瀏覽

高效使用JDBC操作Java java.time物件與PostgreSQL或H2資料庫互動

How can I efficiently insert and retrieve Java `java.time` objects into and from a Postgres or H2 database using JDBC?

本文探討如何有效率地使用JDBC在PostgreSQL或H2資料庫中插入和檢索Java java.time對象,例如LocalDate

傳統方法:使用PreparedStatement::setDateResultSet::getDate

傳統方法依賴過時的java.sql.Date類型,使用PreparedStatement::setDateResultSet::getDate進行操作。然而,為了避免這些問題,建議使用現代方法。

現代方法:直接操作java.time類型

相容於JDBC 4.2以上版本的驅動程式

最有效的方法是使用相容JDBC 4.2以上版本的驅動程式。這些驅動程式直接支援java.time對象,無需進行型別轉換。

插入資料:使用PreparedStatement::setObject(1, myLocalDate),其中myLocalDateLocalDate物件實例。驅動程式會自動偵測並轉換為適當的SQL類型。

擷取資料:使用ResultSet::getObject("my_date_column_", LocalDate.class)檢索LocalDate物件。指定期望的類別可以確保類型安全。

舊版驅動程式(JDBC 4.2以下版本)

對於不相容JDBC 4.2及以上版本的驅動程序,需要暫時將java.time物件轉換為等效的java.sql類型,反之亦然。

使用java.sql.Date.valueOf(myLocalDate)LocalDate轉換為java.sql.Date

插入資料:使用preparedStatement.setDate(1, java.sql.Date.valueOf(myLocalDate))

擷取資料:使用rs.getDate(1)取得java.sql.Date對象,然後使用sqlDate.toLocalDate()將其轉換為LocalDate

使用相容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>

運行結果類似:

<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>

使用舊版驅動程式的範例程式碼 (與原文程式碼相同,此處不再贅述)

透過選擇合適的JDBC驅動程式並使用適當的方法,您可以確保與資料庫進行高效且類型安全的互動。 記住優先使用相容JDBC 4.2及以上版本的驅動程序,以簡化程式碼並提高效率。

以上是如何使用 JDBC 在 Postgres 或 H2 資料庫中高效率插入和檢索 Java `java.time` 物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn