为什么我们在连接到数据库时使用Class.forName(“oracle.jdbc.driver.OracleDriver”)?

2022-09-01 12:00:48

连接到数据库时的实际用途是什么?为什么我们不能只导入相同的类,而是为什么我们要加载它。Class.forName("oracle.jdbc.driver.OracleDriver")


答案 1

使用背后的基本思想是加载 JDBC 驱动程序实现。(普通)JDBC 驱动程序必须包含一个静态初始值设定项,该初始值设定项注册驱动程序实现的实例:Class.forName()java.sql.DriverManager

JDBC 驱动程序必须实现接口,并且实现必须包含加载驱动程序时将调用的静态初始值设定项。此初始值设定项向DriverDriverManager

(摘自 JDBC 4.1 第 9.2 节)

但是,从 JDBC 4.0 开始,就有了一种注册驱动程序的新方法:JDBC 驱动程序的 jar 需要包含一个文件,其中包含该 jar 中实现的名称。使用 创建连接时,它将用于枚举类路径中的所有文件并加载所有驱动程序,以便注册它们。/META-INF/services/java.sql.Driverjava.sql.DriverDriverManagerjava.util.ServiceLoader/META-INF/services/java.sql.Driver

该方法已得到增强,可支持 Java 标准版服务提供程序机制。JDBC 4.0 驱动程序必须包含文件 。此文件包含 JDBC 驱动程序的 实现的名称。DriverManager.getConnectionMETA-INF/services/java.sql.Driverjava.sql.Driver

(摘自 JDBC 4.1 第 9.2.1 节)

以这种方式加载驱动程序的原因是,它允许您将应用程序与其使用的驱动程序(和数据库)分离。这意味着您可以在没有任何驱动程序的情况下编写,编译甚至分发应用程序,您只需要使用(和)包中提供的接口 - 这是Java的一部分 - 而无需直接访问实现。java.sqljavax.sql

然后,应用程序的用户将有效的 JDBC 驱动程序添加到类路径中(并配置连接字符串之类的内容),以便应用程序可以实际连接到数据库。在 JDBC 4.0 之前,用户必须指定驱动程序名称,以便应用程序可以使用 加载它,对于符合 JDBC 4.0 和 Java 6 或更高版本的驱动程序,此发现是自动的。Class.forName

当你从字面上加载驱动程序时,它可能会让人觉得有点过分,但如果你记住它也可能是从配置文件(或从用户输入)中提取的字符串,你可能会开始理解为什么它如此强大。Class.forName("oracle.jdbc.driver.OracleDriver")

当然,这种驱动程序独立性不是100%,特别是如果您的应用程序使用特定于供应商的SQL。但理论是,您的应用程序可以独立于数据库。JDBC还提供了一些额外的机制来解决这个问题,例如JDBC转义,以提供驱动程序转换为特定语法的通用语法,并允许您发现允许您创建或生成兼容查询的功能,保留字等。DatabaseMetaData


答案 2

这是一种传统的方式。导入类,您将具有额外的依赖项

来自 Java 教程:

在以前版本的 JDBC 中,要获取连接,首先必须通过调用方法 Class.forName 来初始化 JDBC 驱动程序。此方法需要一个 java.sql.Driver 类型的对象。每个 JDBC 驱动程序都包含一个或多个实现接口 java.sql.Driver 的类。

...

将自动加载在类路径中找到的任何 JDBC 4.0 驱动程序。(但是,您必须使用 Class.forName 方法手动加载 JDBC 4.0 之前的任何驱动程序。


推荐