连接数据库时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 theDriverManager
(来自 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 fileMETA-INF/services/java.sql.Driver
. This file contains the name of the JDBC driver’s implementation ofjava.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/