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

连接到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(); 声明做。

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

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

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

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

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

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

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

但是该类应该在mysql.jar

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

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

并为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 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 

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

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

那么接下来是调用Class.forName(“com.mysql.jdbc.Driver”)而没有’newInstance()’它会返回com.mysql.jdbc.Driver类并仅注册驱动程序