首頁 >Java >java教程 >如何有效地使用 java.time 類型和 JDBC 進行資料庫互動?

如何有效地使用 java.time 類型和 JDBC 進行資料庫互動?

Linda Hamilton
Linda Hamilton原創
2024-12-24 19:06:14899瀏覽

How to Effectively Use java.time Types with JDBC for Database Interactions?

如何在SQL 資料庫(例如H2)中插入並取得java.time 類型(例如LocalDate)

使用PreparedStatement::setDate 和ResultSet 的舊方法::

使用PreparedStatement::setDate 和ResultSet 的舊方法:: getDate 適用於舊版java.sql.Date 類型。但是,最好避免使用這些麻煩的舊日期時間類別。相反,請使用現代 java.time 類型。

透過JDBC 交換java.time 物件有兩種途徑:

相容於JDBC 4.2 的驅動程式

如果您的JDBC 驅動程式符合使用JDBC 4.2 規格或更高版本,您可以直接處理java.time 物件。相容的驅動程式知道 java.time 類型,並添加了 setObject/getObject 方法來處理它們。

要將資料傳送到資料庫,只需將 java.time 物件傳遞給PreparedStatement::setObject。驅動程式會偵測傳遞的參數的 Java 類型並將其轉換為適當的 SQL 類型。 Java LocalDate 轉換為 SQL DATE 類型。

要從資料庫檢索數據,請呼叫 ResultSet::getObject。我們可以傳遞一個額外的參數,即我們期望接收的資料類型的 Class,而不是強制轉換產生的 Object 物件。透過指定預期的類,我們可以透過您的 IDE 和編譯器進行類型安全檢查和驗證。

較舊的驅動程序,在JDBC 4.2 之前

如果您的JDBC 驅動程式尚不符合JDBC 4.2 或稍後,您需要將java.time 物件簡單地轉換為其等效的java.sql 類型,反之亦然。查看新增到舊類別中的新轉換方法。

這是一個完整的工作範例應用程序,展示如何在 H2 資料庫中插入和選擇 LocalDate 值:
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" ) );
                preparedStatement.setObject ( 1 , today.minusDays ( 1 ) );  // Yesterday.
                preparedStatement.executeUpdate ( );
                preparedStatement.setObject ( 1, today );                  // Today.
                preparedStatement.executeUpdate ( );
                preparedStatement.setObject ( 1, today.plusDays ( 1 ) );   // Tomorrow.
                preparedStatement.executeUpdate ( );
            }
            // Query all.
            sql = "SELECT * FROM test_";
            try ( ResultSet rs = stmt.executeQuery ( sql ) ; ) {
                while ( rs.next ( ) ) {
                    UUID id = rs.getObject ( "id_" , UUID.class );  // Pass the class to be type-safe.
                    LocalDate localDate = rs.getObject ( "date_", LocalDate.class );  // Pass class for type-safety.
                    System.out.println ( "id_: " + id + " | date_: " + localDate );
                }
            }
        } catch ( SQLException e ) {
            e.printStackTrace ( );
        }
    }
}

以上是如何有效地使用 java.time 類型和 JDBC 進行資料庫互動?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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