Java 为什么在连接数据库时使用Class.forName(“;oracle.jdbc.driver.OracleDriver”;)?
连接到数据库时,Java 为什么在连接数据库时使用Class.forName(“;oracle.jdbc.driver.OracleDriver”;)?,java,jdbc,Java,Jdbc,连接到数据库时,Class.forName(“oracle.jdbc.driver.OracleDriver”)的实际用途是什么?为什么我们不能只导入同一个类,而不是加载它。这是一种传统的方式。导入类时,您将具有额外的依赖项 来自Java教程: 在以前版本的JDBC中,要获得连接,首先必须 通过调用Class.forName方法初始化JDBC驱动程序。这 方法需要java.sql.Driver类型的对象。每个JDBC驱动程序 包含一个或多个实现接口的类 java.sql.Driver 在类中找
Class.forName(“oracle.jdbc.driver.OracleDriver”)
的实际用途是什么?为什么我们不能只导入同一个类,而不是加载它。这是一种传统的方式。导入类时,您将具有额外的依赖项
来自Java教程:
在以前版本的JDBC中,要获得连接,首先必须
通过调用Class.forName方法初始化JDBC驱动程序。这
方法需要java.sql.Driver类型的对象。每个JDBC驱动程序
包含一个或多个实现接口的类
java.sql.Driver
在类中找到的任何JDBC4.0驱动程序
路径将自动加载。(但是,您必须手动加载任何
JDBC 4.0之前的驱动程序,方法类为.forName。)
使用
Class.forName(“”)而不是直接引用类的几个原因:
使用Class.forName(“”)
可以更明显地控制在代码中首次尝试加载指定类的确切位置。这使得当代码运行时,如果类路径中不存在该类,那么代码将失败(抛出异常)的位置更加明显
如果您只是导入该类,然后在代码中引用它,那么如果该类不存在,代码将抛出异常的地方就变得不那么明显了
另外,使用Class.forName(“”)
是绕过潜在编译时限制的一种方法。例如,如果编译代码的人(比如说,由于许可或知识产权原因)无权访问类oracle.jdbc.driver.OracleDriver,他们可能会发现通过class.forName(“”
)而不是直接编译引用类的代码更容易
如果您不需要使用指定类的任何方法、字段或内部类,那么class.forName(“”
可能是最清晰的表达方式,表示只需要加载类(并运行其静态初始值设定项),而无需其他操作
我认为Class.forName与直接引用类没有任何不同的函数行为。默认情况下,它使用调用类的classloader,它应该与直接引用类时使用的classloader相同。Class.forName(“”)有一些重载,可以让您更多地自定义类加载行为。使用Class.forName()
的基本思想是加载JDBC驱动程序实现。(普通)JDBC驱动程序必须包含一个静态初始值设定项,该初始值设定项将驱动程序实现的实例注册到java.sql.DriverManager
:
JDBC驱动程序必须实现驱动程序
接口,并且实现必须包含加载驱动程序时将调用的静态初始值设定项。此初始值设定项向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
文件并加载所有驱动程序,以便注册它们
DriverManager.getConnection
方法已得到增强,以支持Java标准版服务提供程序机制。JDBC4.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.forName
加载驱动程序,使用符合JDBC 4.0的驱动程序和Java 6或更高版本,此发现是自动的
当您使用Class.forName(“oracle.jdbc.driver.OracleDriver”)
加载驱动程序时,可能会感觉有些过分,但如果您记住它也可能是从配置文件(或用户输入)中提取的字符串,您可能会开始理解它为何如此强大
当然,这种驱动程序独立性不是100%,尤其是当应用程序使用特定于供应商的SQL时。但理论上,您的应用程序可以是独立于数据库的。JDBC还提供了一些额外的机制来解决这个问题,例如JDBC转义以提供驱动程序转换为特定语法的通用语法,以及允许您发现功能的DatabaseMetaData
,保留字等,允许您创建或生成兼容查询。有时需要在运行时加载类。i、 任何类都可以在执行java应用程序时动态加载到内存位置。Class.forName
用于在运行时加载任何给定的类(在双引号内作为字符串)。例如,当我们使用IDE时,我们会看到一个GUI构建器,它允许我们进行拖放