問題
如何從您🎜>問題
如何使用JDBC 將java.time 類型(例如LocalDate)插入和檢索到SQL 資料庫(例如H2)中嗎?使用PreparedStatement::setDate 和ResultSet::getDate 的舊方法適用於遺留的java.sql.Date 類型,但您希望避免使用這些麻煩的舊日期時間類別。透過 JDBC 驅動程式傳送 java.time 類型的現代方法是什麼?
解決方案
如果您的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中文網其他相關文章!