使用PreparedStatement::setDate 和 ResultSet 的旧方法::getDate 适用于旧版 java.sql.Date 类型。但是,最好避免使用这些麻烦的旧日期时间类。相反,请使用现代 java.time 类型。
通过 JDBC 交换 java.time 对象有两种途径:
如果您的 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 驱动程序尚不符合 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中文网其他相关文章!