首页 >Java >java教程 >如何有效地使用 java.time 类型和 JDBC 进行数据库交互?

如何有效地使用 java.time 类型和 JDBC 进行数据库交互?

Linda Hamilton
Linda Hamilton原创
2024-12-24 19:06:14900浏览

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

如何在 SQL 数据库(例如 H2)中插入和获取 java.time 类型(例如 LocalDate)

使用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