Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在连接数据库时使用Class.forName(“;oracle.jdbc.driver.OracleDriver”;)?_Java_Jdbc - Fatal编程技术网

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构建器,它允许我们进行拖放