关于jdbc的用法很多教程,但是教程上都没有说过关于开头的驱动的写法的原因,自己去找了一下资料,这里稍作探讨。
1.png
这是很多教材上的驱动的写法,但很少人去说为什么要用Class.forName("com.mysql.jdbc.Driver");这一句,而DriverManager.getConnection()这个接口,是如何实现的。
package com.mysql.jdbc
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// --------------------------------------------- //
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
// ~ Constructors
// -----------------------------------------------------------
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
先看看Driver的源码,源码上可以看到Driver在被调用的时候就被生成了一个实例。Class.forName()返回与给定的字符串名称相关联类或接口的Class对象,Class.forName是一个静态方法,同样可以用来加载类。forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)。
Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。
com.mysql.jdbc.Driver在装载完后自动帮我们完成了这一步骤