当连接到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
对象,是由类加载器加载的paramater。 所述newInstance()
方法,然后返回类的新实例。
那么接下来会发生什么是你调用Class.forName(...)
返回com.mysql.jdbc.Driver.class。 然后调用newInstance()
对类返回类的一个实例,蒙山没有PARAMATERS,所以它基本上调用new com.mysql.jdbc.Driver();
。
它初始化类"com.mysql.jdbc.Driver"
如果在classpath中发现,这意味着司机被注册在JDBC驱动程序管理,因为注册过程是驱动器类的静态初始化中...
还有就是你可以用它来注册驱动程序的另一种方法:是使用静态DriverManager.registerDriver()
方法。
这将创建一个新的实例com.mysql.jdbc.Driver
类,因此调用静态初始化将注册与司机DriverManager
,所以你可以根据你在第二行使用URL创建MySQL连接。
然而,类应该在mysql.jar
。
从引用JDBC规范 ,第9章,第2章:
JDBC驱动程序必须实现驱动程序接口,并且该实现必须包含一个静态初始化加载驱动程序时,将调用。 这初始化向DriverManager注册自己的新实例。
和示例代码提供了一种用于AcmeJdbcDriver
如下:
public class AcmeJdbcDriver implements java.sql.Driver {
static {
java.sql.DriverManager.registerDriver(newAcmeJdbcDriver());
}
}
而当你调用的Class.forName(字符串的className) ,根据API文档,将出现以下情况:
到的forName(“X”)的调用会导致类名为X被初始化。
其中初始化涉及要执行的静态块码。
所以基本上,你初始化驱动程序类,并依次类本身与注册java.sql.DriverManager
每个JDBC规范。
请注意,这不是不再需要。 详情可参阅这里 。
类DriverManager方法的getConnection和getDrivers已得到增强,支持Java标准版服务提供商的机制。 JDBC 4.0驱动程序必须包含文件META-INF /服务/ java.sql.Driver中。 此文件包含JDBC驱动程序实现java.sql.Driver中的名称。 例如,加载my.sql.Driver类中,META-INF /服务/ java.sql.Driver文件需要包含下面的条目:
my.sql.Driver
应用程序不再需要显式地加载使用Class.forName JDBC驱动程序()。
它创建com.mysql.jdbc.Driver类的新实例,并注册驱动程序。
那么接下来发生的事情是,你调用Class.forName(“com.mysql.jdbc.Driver”)没有'的newInstance()返回com.mysql.jdbc.Driver类,只有注册驱动程序
文章来源: what exactly does this do Class.forName(“com.mysql.jdbc.Driver”).newInstance();