这究竟做了什么Class.forName("com.mysql.jdbc.Driver").newInstance();

17 java mysql database jsp class

连接到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");
Run Code Online (Sandbox Code Playgroud)

其实我想知道Class.forName("com.mysql.jdbc.Driver").newInstance();声明做了什么.

Althogh这个类不在mysql.jar中.它在哪里?

cho*_*ger 26

Class类位于java.lang包,因此在分布用java,并自动导入到每个班级.

forName()方法的作用是返回Class由类加载器加载的参数的对象.newInstance()然后该方法返回该类的新实例.

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

  • 我投了反对票,因为尽管这在技术上是正确的,但它无论如何都无助于理解为什么在使用 jdbc 连接的上下文中使用此代码。它也没有提到不再需要这行代码。Koray的回答更有意义,也更符合最新情况。 (2认同)

ale*_*oot 7

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

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


Kor*_*gay 6

引用《JDBC规范》第9章第2节:

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

并提供了AcmeJdbcDriver以下示例代码:

public class AcmeJdbcDriver implements java.sql.Driver {
    static {
        java.sql.DriverManager.registerDriver(newAcmeJdbcDriver());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

对DriverManager方法getConnection和getDrivers进行了增强,以支持Java Standard Edition Service Provider机制。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
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个更好的解释!谢谢你! (3认同)

Jan*_*net 5

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

然而,班级应该在mysql.jar.

  • 您无需创建实例来运行静态块. (2认同)