目录
如何在 SQL 数据库(例如 H2)中插入和获取 java.time 类型(例如 LocalDate)
兼容 JDBC 4.2 的驱动程序
较旧的驱动程序,在 JDBC 4.2 之前
首页 Java java教程 如何有效地使用 java.time 类型和 JDBC 进行数据库交互?

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

Dec 24, 2024 pm 07:06 PM

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)