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

标签 java jdbc

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

最佳答案

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

JDBC drivers must implement the Driver interface, and the implementation must contain a static initializer that will be called when the driver is loaded. This initializer registers a new instance of itself with the DriverManager

(来自 JDBC 4.1,第 9.2 节)

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

The DriverManager.getConnection method has been enhanced to support the Java Standard Edition Service Provider mechanism. JDBC 4.0 Drivers must include the file META-INF/services/java.sql.Driver. This file contains the name of the JDBC driver’s implementation of java.sql.Driver.

(来自 JDBC 4.1,第 9.2.1 节)

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

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

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

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

关于java - 为什么我们在连接数据库时使用 Class.forName (“oracle.jdbc.driver.OracleDriver” )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44540817/

相关文章:

java - OWLAPI 查找特定类的所有 DataSomeValuesFrom

Java 和 MySQL PreparedStatement : storing 5000 numbers in a table. 什么是正确的方法?

java - SQL 语句中的哪个通配符必须用于 Access *.mdb 文件查询(使用 Java 和 JDBC :ODBC bridge)

java - 使用 Spring 初始化 SqlFactory,但在将数据源转换为其底层类时出现异常

java - JDBC - 连接到特定端口上的远程 MySQL 数据库

mysql - 依赖于第一个查询的第二个查询面临的问题

具有自动完成功能的 Java JComboBox

java - 在已经从文本中随机选择一个单词后,如何从文本文件中打乱单词

java - 在java中显示两个表中的值

java - 在java中读取.msg文件的加密附件