JDBC源码分析

本文深入探讨了JDBC源码,尤其是驱动加载过程。从JDBC4.0开始,驱动可以自动加载,不再需要显式调用Class.forName()。JVM根据URL选择合适的驱动并注册到DriverManager,所有驱动信息存储在Vector中。当建立连接时,DriverManager遍历驱动列表尝试建立连接,成功则返回Connection。
摘要由CSDN通过智能技术生成

这段时间有点空闲时间,觉得自己学习不够深入,所以开始学习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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值