20

在连接到 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 中。它现在在哪里?

4

5 回答 5

26

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

forName()方法所做的只是返回Class由类加载器加载的参数的对象。然后该newInstance()方法返回该类的一个新实例。

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

于 2013-02-23T10:10:45.907 回答
7

如果在类路径中找到它会初始化"com.mysql.jdbc.Driver"类,这意味着驱动程序已在 JDBC 驱动程序管理器中注册,因为注册过程在驱动程序类的静态初始化程序中......

您可以使用另一种方法来注册驱动程序:使用静态DriverManager.registerDriver()方法。

于 2013-02-23T10:06:38.970 回答
7

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

JDBC 驱动程序必须实现 Driver 接口,并且该实现必须包含一个静态初始化程序,该初始化程序将在驱动程序加载时被调用。这个初始化器向 DriverManager 注册一个新的自身实例。

并提供了一个示例代码AcmeJdbcDriver如下:

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

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

调用 forName("X") 会导致初始化名为 X 的类。

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

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

请注意,这不再需要。详细信息可以在这里找到。

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

my.sql.Driver

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

于 2017-05-21T06:08:31.887 回答
5

它将创建com.mysql.jdbc.Driver该类的一个新实例,因此调用静态初始化,该初始化将向 注册驱动程序,DriverManager因此您可以根据您在第二行中使用的 URL 创建 mysql 连接。

然而,该类应该在mysql.jar.

于 2013-02-23T10:06:33.300 回答
-1

它创建 com.mysql.jdbc.Driver 类的新实例并注册驱动程序。

那么发生的情况是你调用 Class.forName("com.mysql.jdbc.Driver") 没有 'newInstance()' 它返回 com.mysql.jdbc.Driver 类并仅注册驱动程序

于 2017-12-06T17:42:19.763 回答