Jdbc Class.forName(Driver.Class)

Jdbc Class.forName(Driver.Class),jdbc,classloader,Jdbc,Classloader,在建立数据库连接的上下文中,我们通常导入所需的包,并使用Class.forName()由调用类的类加载器加载所需的驱动程序类 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; .... .... Class.forName("com.mysql.jdbc.Driver"); Connection con=DriverManager.getConnection(...

在建立数据库连接的上下文中,我们通常导入所需的包,并使用Class.forName()由调用类的类加载器加载所需的驱动程序类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 ....
 ....
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(...);
我们不能简单地删除类.forName(),如下所示:-

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.*;
 ....
 ....

Connection con=DriverManager.getConnection(...);
我的问题是,当一个类的依赖项由加载依赖类的同一个类加载器加载时,使用与class.forName(className)隐式相同的机制,为什么要显式地给class.forName()。只需在import语句中包含驱动程序类。 在装入DriverManager.getConnection()行时,驱动程序类是否不会自动加载?com.mysql.jdbc包位于import语句中。 或者我需要像这样添加所有行吗

Class clazz=com.mysq.jdbc.Driver.class

要触发Class.forName()。

在运行时,
import
语句不会执行任何操作。它甚至不是编译类的一部分。它只是告诉编译器在哪里查找内容


Class dummy=com.mysql.jdbc.Driver.Class
这样的行可以工作,但是您对mysql驱动程序JAR文件有编译时依赖性(Class.forName没有,但在总体方案中可能不是一件坏事)。

首先,加载驱动程序类不再是必要的,因为Java有一个内置的服务提供者加载机制,可以在类路径中的jar文件中查找可用的驱动程序

仅仅导入一个类不足以加载它。导入只允许您在编译时使用类的简单名称而不是完全限定名称引用该类。但是,如果您从未实际加载该类,它将不会做任何事情


您确实可以在不使用反射的情况下加载类,但这意味着您需要将驱动程序作为编译时依赖项,这通常是不需要的:您不应该依赖驱动程序中特定于数据库的类,而应该只依赖于标准JDBC接口。编译类路径中没有驱动程序可以确保这一点。

只要驱动程序符合JDBC 4.0标准,就不需要
类.forName()
。 请阅读有关如何处理此问题的说明


当然,驱动程序仍然需要在类路径上。这对于
Class.forName()
也是如此(否则会抛出
ClassNotFoundException

“应该不再需要加载驱动程序类了”。不过,我从未见过这种工作-(这是否仅在驱动程序JAR文件位于系统类路径上(与动态加载的内容相反)时才起作用?我想是的。我几乎从不使用DriverManager,而且总是通过连接池,因此我对它没有太多具体的经验。那么像“Class dummy”这样的行如何帮助加载类?调用Class.forName()隐式生成?谁调用?或者该行只是被Class.forName(com.mysql.jdbc.Driver.Class)替换在哪种情况下,这将不再是编译时依赖关系?如果您引用一个类,它将被加载。对于JDBC驱动程序,您只需要向驱动程序管理器注册它。当您在代码中引用一个类时(如
new Arraylist()
com.mysql.JDBC.driver.class
)JVM将首先自动加载类(如果尚未加载)。