实际用途是什么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(使用前将#替换为@)