这到底是怎么回事 Class.forName(“com.mysql.jdbc.Driver”).newInstance();

2022-09-02 02:56:33

在连接到MySQL数据库时,我执行以下步骤

Connection con = null;
Resultset rs = null;
Statement st = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","root","passwp");

实际上,我想知道声明是做什么的。Class.forName("com.mysql.jdbc.Driver").newInstance();

但是,这个类不在mysql中.jar。它在哪里?


答案 1

该类位于java.lang包中,因此它与java一起分发,并自动导入到每个类中。Class

该方法的作用是只返回由类装入器装入的参数的对象。然后,该方法返回该类的新实例。forName()ClassnewInstance()

那么接下来发生的事情是你称之为返回com.mysql.jdbc.Driver.class。然后,您调用该类,该类返回该类的实例,没有参数,因此它基本上调用 。Class.forName(...)newInstance()new com.mysql.jdbc.Driver();


答案 2

引用 JDBC 规范,第 9 章,第 2 节:

JDBC 驱动程序必须实现驱动程序接口,并且实现必须包含一个静态初始值设定项,该初始值设定项将在加载驱动程序时调用。此初始值设定项向驱动程序管理器注册自身的新实例。

并提供的示例代码如下:AcmeJdbcDriver

public class AcmeJdbcDriver implements java.sql.Driver {
    static {
        java.sql.DriverManager.registerDriver(newAcmeJdbcDriver());
    }
}

当您调用 Class.forName(String className) 时,根据 API 文档,会发生以下情况:

对 forName(“X”) 的调用会导致名为 X 的类被初始化。

其中,初始化涉及要执行的静态块中的代码。

因此,基本上,您初始化 Driver 类,然后该类根据 JDBC 规范注册自身。java.sql.DriverManager

请注意,不再需要这样做。详情请按

DriverManager 方法 getConnection 和 getDrivers 已得到增强,以支持 Java 标准版服务提供程序机制。JDBC 4.0 驱动程序必须包含文件 META-INF/SERVICES/java.sql.Driver。此文件包含 java.驱动程序的 JDBC 驱动程序实现的名称.sql.驱动程序。例如,要加载 my.sql.Driver 类,META-INF/SERVICES/java.sql.Driver 文件将包含以下条目:

my.sql.Driver

应用程序不再需要使用 Class.forName() 显式加载 JDBC 驱动程序。