java.time.LocalDate
對象問題:
如何使用JDBC在H2數據庫引擎等SQL數據庫中插入和檢索java.time
類型(例如LocalDate
)?
解答:
方法一:兼容JDBC 4.2的驅動程序
對於符合JDBC 4.2規範或更高版本的JDBC驅動程序,您可以直接使用setObject
和getObject
方法處理java.time
對象。驅動程序會自動檢測Java類型並將其轉換為相應的SQL類型。例如:
preparedStatement.setObject(1, myLocalDate); // LocalDate转换为SQL DATE
LocalDate localDate = myResultSet.getObject("my_date_column_", LocalDate.class); // 指定预期类以确保类型安全
方法二:JDBC 4.2之前的舊版驅動程序
對於不兼容JDBC 4.2的驅動程序,您必須將java.time
對象短暫轉換為等效的java.sql
類型,反之亦然。使用添加到舊版類中的轉換方法:
java.sql.Date mySqlDate = java.sql.Date.valueOf(myLocalDate);
preparedStatement.setDate(1, mySqlDate);
java.sql.Date sqlDate = myResultSet.getDate("date_"); //尽可能简短地处理转换
LocalDate localDate = sqlDate.toLocalDate();
兼容JDBC 4.2的驅動程序示例:
import java.sql.*;
import java.time.LocalDate;
import java.time.ZoneId;
public class LocalDateExample {
public static void main(String[] args) throws SQLException {
String url = "jdbc:h2:mem:test_db"; // 更改为您的数据库URL
String user = "user";
String password = "password";
try (
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
) {
stmt.execute("CREATE TABLE IF NOT EXISTS employees (id INT PRIMARY KEY, name VARCHAR(255), birthday DATE)");
// 插入LocalDate值
LocalDate today = LocalDate.now(ZoneId.of("America/Montreal"));
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO employees (name, birthday) VALUES (?, ?)");
pstmt.setString(1, "John Doe");
pstmt.setObject(2, today); // 直接传递LocalDate
pstmt.executeUpdate();
// 检索LocalDate值
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
while (rs.next()) {
LocalDate birthday = rs.getObject("birthday", LocalDate.class); // 指定预期类
System.out.println("员工:" rs.getString("name") ",生日:" birthday);
}
rs.close();
pstmt.close();
stmt.close();
}
}
}
舊版驅動程序示例:
import java.sql.*;
import java.time.LocalDate;
public class LocalDateExample {
public static void main(String[] args) throws SQLException {
String url = "jdbc:h2:mem:test_db"; // 更改为您的数据库URL
String user = "user";
String password = "password";
try (
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
) {
stmt.execute("CREATE TABLE IF NOT EXISTS employees (id INT PRIMARY KEY, name VARCHAR(255), birthday DATE)");
// 插入LocalDate值
LocalDate today = LocalDate.now();
java.sql.Date sqlDate = java.sql.Date.valueOf(today);
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO employees (name, birthday) VALUES (?, ?)");
pstmt.setString(1, "John Doe");
pstmt.setDate(2, sqlDate); // 将LocalDate转换为java.sql.Date
pstmt.executeUpdate();
// 检索LocalDate值
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
while (rs.next()) {
java.sql.Date sqlDate = rs.getDate("birthday");
LocalDate birthday = sqlDate.toLocalDate(); // 将java.sql.Date转换为LocalDate
System.out.println("员工:" rs.getString("name") ",生日:" birthday);
}
rs.close();
pstmt.close();
stmt.close();
}
}
}
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3