首頁 >Java >java教程 >如何使用 JDBC 從 H2 資料庫插入和檢索 java.time.LocalDate 物件?

如何使用 JDBC 從 H2 資料庫插入和檢索 java.time.LocalDate 物件?

Barbara Streisand
Barbara Streisand原創
2024-12-20 06:24:09800瀏覽

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

如何從SQL 資料庫(如H2)插入和擷取java.time.LocalDate 物件

問題

如何從您🎜>問題

如何使用JDBC 將java.time 類型(例如LocalDate)插入和檢索到SQL 資料庫(例如H2)中嗎?使用PreparedStatement::setDate 和ResultSet::getDate 的舊方法適用於遺留的java.sql.Date 類型,但您希望避免使用這些麻煩的舊日期時間類別。透過 JDBC 驅動程式傳送 java.time 類型的現代方法是什麼?

解決方案

  • 透過JDBC 交換java.time 物件有兩種方法:
  • 相容JDBC 4.2 的驅動程式:如果您的JDBC 驅動程式符合JDBC 4.2規範或更高版本,您可以直接處理 java.time 物件。
較早的驅動程序,在JDBC 4.2 之前:

如果您的JDBC 驅動程式不符合JDBC 4.2 或更高版本,您必須簡單地將java.time 物件轉換為其等效的java.sql 類型,反之亦然。尋找新增到舊類別中的新轉換方法。

遺留的日期時間類,如java.util.Date、java.util.Calendar 及其相關的java.sql 對應類,如java.sql. sql.Date 的問題是出了名的,它是用有缺陷的、被駭客攻擊的方法設計的。它們容易出錯、麻煩且令人困惑。盡可能避免使用它們,因為它們現在已被 java.time 類別取代。

使用 JDBC 4.2 相容驅動程式

內建的 H2 JDBC 驅動程式(截至2017-03)似乎符合 JDBC 4.2。相容的驅動程式可以識別 java.time 類型。 JDBC 委員會沒有加入 setLocalDate/getLocalDate 方法,而是新增了 setObject/getObject 方法。
myPreparedStatement.setObject(1, myLocalDate); // Automatic detection and conversion of data type.

要將資料傳送到資料庫,只需將 java.time 物件傳遞給PreparedStatement::setObject。驅動程式會偵測傳遞的參數的 Java 類型並將其轉換為適當的 SQL 類型。 java.time.LocalDate 轉換為 SQL DATE 類型。有關這些映射的列表,請參閱 JDBC Maintenance Release 4.2 PDF 文件的第 22 節。

LocalDate localDate = myResultSet.getObject("my_date_column_", LocalDate.class);

要從資料庫檢索數據,請呼叫 ResultSet::getObject。您可以提供一個附加參數來指定您期望接收的資料類型的類,而不是強制轉換產生的 Object 物件。透過明確指定所需的類,您可以獲得類型安全性,類型安全性由您的 IDE 和編譯器檢查和驗證。

程式碼範例:

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" ) );
這裡是將 LocalDate 值插入並選擇到 H2 資料庫中的應用程式的完整工作範例:

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

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