首先写一下Mysql驱动的加载和获取数据库连接对象的过程
import java.sql.*;
class test2{
private Connection conn;
public test2(){
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.gerConnection("jdbc:mysql://localhost/mydatebaseName","loginName"."password");
}
}
这其中的Class.forName为加载驱动的过程。首先,简单介绍下这个方法。这个放在是获得将类的字节码加载到内存中去,并对类中的静态成员初始化,默认调用的当前所在类的ClassLoader. 当然这个类也是有重载,可以制定类加载器。在java的api中是这样写道。
public static Class<?> forName(String name, , )
throws ClassNotFoundException
使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class
对象。(以 getName
所返回的格式)给定一个类或接口的完全限定名,此方法会试图定位、加载和链接该类或接口。指定的类加载器用于加载该类或接口。如果参数 loader
为 null,则该类通过引导类加载器加载。只有 initialize
参数为 true
且以前未被初始化时,才初始化该类。
这样基本确定了。这个方法的作用的和加载过程。然后通过查找com.mysql.jdbc.Driver的源码
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
发现官方在这个代码中就完成了两个事,第一次,完成一个构造方法。第二,通过静态语句块完成注册驱动。
当程序在Class.forName("com.mysql.jdbc");的时候呢。程序会把这个类加载到内存中去,并初始化静态语句块,在初始化静态语句块的时候, 它竟然 把自己的驱动也顺便注册了。
java.sql.DriverManager.registerDriver(new Driver());
而且是把自己的本类当成一个驱动给注册了。 这样我们再次使用DriverManager的时候,驱动就别装载好了。无需要再次装在。 这也就是这句话的根本含义吧。