这段时间有点空闲时间,觉得自己学习不够深入,所以开始学习JDBC源码
以前对我们一般人来说JDBC就是一套步骤:
一、引入jar包(JDBC驱动)
二、加载驱动
三、创建连接
四、开始吧啦吧啦操作数据库
五、关闭资源
ok,只要执行了这几个操作我们就能完成对数据库的操作
但这只是知其然而不知其所以然
比如为什么要加载驱动,很显然在我们的代码中并没有用到那个驱动,难道仅仅将他加载到内存就有用?
在这篇文章中我们就来分析加载驱动这个过程
首先说一点jdbc4.0和jdbc3的区别,自从jdk6以后jdbc也相应升级到了4.0版本,其中有一个不同就是可以不用再显式加载驱动
也就是说我们不必再写Class.forName(driver);系统会自动加载CLASSPATH下的类,可以用这样的方法验证:
将jvm参数设置为-verbose或者-verbose:class我们就能在控制台看到启动过程中被加载的类,我们不显式加载驱动,但是也可以在控制台看到驱动类被加载了,要是我们引入了不止一个驱动(不同数据库,要是相同数据库的不同版本的驱动,没试过,但是估计会出版本问题,或者是会使用第一个被加载的,第二种比较可能,猜测的原因后面会讲,这不是重点,就不钻牛角尖了)那么所有的驱动都会被加载,那么就会出现一个问题:jvm是怎么判断使用哪一个呢?很简单,是根据我们提供的url进行判断的,jvm加载所有的驱动(CLASSPATH下的实现了java.sql.Driver接口的类,以及我们手动用Class.forName()或者其他方式加载的驱动)并将这些驱动放入一个Vector中,然后获得连接时,遍历这个Vector对其中的所有驱动都用我们配置的url和用户信息去获得连接,获得成功就返回Connection,所有的Driver都有一个connect方法是用来获得连接的,对于mysql来说,com.mysql.jdbc.Driver继承了NonRegisteringDriver,而NonRegisteringDriver实现了connect方法,也就是说驱动类的作用就是获得连接用的
下面我们来看具体代码:
根据jdbc规范,要求所有驱动都必须实现java.sql.Drvier接口,并且有一个静态代码块,在静态代码块中要调用java.sql.DriverManager的registerDriver方法注册当前驱动类:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
那么registerDriver方法是如何执行的呢?
public static synchron