这究竟做了什么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类并仅注册驱动程序