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

2024-01-11

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


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

JDBC 驱动程序必须实现Driver接口,并且实现必须包含一个静态初始化程序,该初始化程序将在加载驱动程序时调用。该初始化程序向其注册一个新实例DriverManager

(来自 JDBC 4.1,第 9.2 节)

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

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

(来自 JDBC 4.1,第 9.2.1 节)

以这种方式加载驱动程序的原因是,它允许您将应用程序与其使用的驱动程序(和数据库)解耦。这意味着您可以编写、编译甚至分发应用程序而无需任何驱动程序,您只需要使用java.sql (and javax.sql) 包 - 这是 Java 的一部分 - 无需直接访问实现。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐