Class.forName("oracle.jdbc.driver.OracleDriver")连接数据库时的实际用途是什么?为什么我们不能导入相同的类,而是我们为什么要加载它.
Mar*_*eel 23
使用的基本思想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.Driverjar中实现的名称.当您使用创建连接时DriverManager,它将java.util.ServiceLoader用于枚举/META-INF/services/java.sql.Driver类路径中的所有文件并加载所有驱动程序,以便它们进行注册.
该
DriverManager.getConnection方法已得到增强,可支持Java Standard Edition Service Provider机制.JDBC 4.0驱动程序必须包含该文件META-INF/services/java.sql.Driver.该文件包含JDBC驱动程序的实现名称java.sql.Driver.
(来自JDBC 4.1,第9.2.1节)
驱动程序以这种方式加载的原因是它允许您将应用程序与它使用的驱动程序(和数据库)分离.这意味着您可以编写,编译甚至分发没有任何驱动程序的应用程序,您只需要使用java.sql(和javax.sql)包中提供的接口- 这是Java的一部分 - 而无需直接访问实现.
然后,应用程序的用户将有效的JDBC驱动程序添加到类路径中(并配置连接字符串之类的内容),以便应用程序实际上可以连接到数据库.在JDBC 4.0之前,用户必须指定驱动程序名称,以便应用程序可以使用Class.forNameJDBC 4.0兼容驱动程序和Java 6或更高版本来加载它,这种发现是自动的.
当您按字面意思加载驱动程序Class.forName("oracle.jdbc.driver.OracleDriver")时可能会感觉有点过分,但如果您记住它也可能是从配置文件(或用户输入)中提取的字符串,您可能会开始理解为什么它如此强大.
当然,此驱动程序独立性不是100%,尤其是如果您的应用程序使用特定于供应商的SQL.但理论是您的应用程序可以独立于数据库.JDBC还提供了一些额外的机制来解决这个问题,例如JDBC转义以提供驱动程序转换为特定语法的通用语法,并DatabaseMetaData允许您发现允许您创建或生成兼容查询的功能,保留字等.
这是一种传统的方式.导入类将具有额外的依赖性
来自Java教程:
在以前的JDBC版本中,要获得连接,首先必须通过调用Class.forName方法来初始化JDBC驱动程序.此方法需要java.sql.Driver类型的对象.每个JDBC驱动程序都包含一个或多个实现接口java.sql.Driver的类.
...
在类路径中找到的任何JDBC 4.0驱动程序都会自动加载.(但是,必须使用方法Class.forName手动加载JDBC 4.0之前的任何驱动程序.)
使用Class.forName("")而不是直接引用类的几个原因:
使用Class.forName("")可以让您更明显地控制代码中第一次尝试加载指定类的位置。如果该类在代码运行时不存在于类路径中,这使得代码将在哪里失败(抛出异常)变得更加明显。
如果您只是导入该类,然后在代码中引用它,那么如果该类不存在,代码将抛出异常的情况就会变得不太明显。
此外,使用Class.forName("")是一种绕过潜在编译时限制的方法。例如,如果编译代码的人(例如,出于许可或知识产权原因)无法访问类 oracle.jdbc.driver.OracleDriver,他们可能会发现编译引用该类的代码更容易Class.forName("")而不是直接。
如果您不需要使用指定类的任何方法、字段或内部类,那么Class.forName("")最清楚的方式可能是表达唯一需要的就是加载该类(并运行其静态初始化程序),除此之外别无其他。
我不认为 Class.forName 表现出与直接引用类不同的功能行为。它默认使用调用类的类加载器,该类加载器应该与直接引用该类时使用的类加载器相同。Class.forName("") 有一些重载,可以让您更多地自定义类加载行为。
| 归档时间: |
|
| 查看次数: |
38463 次 |
| 最近记录: |