1. 工作原理
一般我们主要的JDBC处理流程如下:
graph TD
A[注册一个Driver] -->B(建立数据库连接)
B --> C(创建一个Statement)
C-->D(执行SQL语句,获取结果)
D-->F(关闭JDBC对象)
1.1 加载驱动
首先声明:这个阶段在1.6之后就不需要手动执行了,也就是这个代码不需要了!!!分析它有利于理解流程。
Class.forName("com.mysql.jdbc.Driver")
上面代码发生在注册Driver阶段,指的是让JVN将com.mysql.jdbc.Driver这个类加载入内存中,最重要的是将mysql驱动注册到DriverManager中去。
此处加载Driver
的时候,加载的是java.mysql.jdbc
包下的,这其实是一种向后兼容的做法,实际上代码都是写在了com.mysql.cj.jdbc
下,所以,mysql的连接包使用了继承的方式,com.mysql.jdbc.Driver
只是对外的一个兼容类,其父类是com.mysql.cj.jdbc.Driver
,真正的的mysql Driver驱动。
加载Driver
的目的就是加载它的父类:
public class Driver extends com.mysql.cj.jdbc.Driver {
public Driver() throws SQLException {
super();
}
}
我们打开com.mysql.cj.jdbc.Driver
,可以发现,里面有一个构造空方法,这也是调用Class.forName().newInstance()
所需要的,这个类继承了NonRegisteringDriver
,实现了java.mysql.Driver
。 里面有一个空无参构造方法,为反射调用newInstance()
准备的,另外就是静态代码块,静态代码块主要的功能是通过DriverManager
注册自己(Driver
,也就是驱动),这里很重要的一点,就是Driver是java.sql.Driver
(这是jdk的包!!!)的实现。
我们引入的驱动本质上是JDK中的Driver的实现类,为啥?这就是标准,约束,不这样干,不合规矩。
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
// 调用DriverManager 注册自己(Driver)
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
// Class.forName().newInstance() 所需要的
}
}
DriverManager
里面基本全是static方法,也就是专门管理各种驱动的,registerDriver()
方法如同其名字,就是为了注册驱动,注册到哪里呢? 看下面的代码,可以知道,driverInfo(驱动相关信息)会被添加到registeredDrivers
里面去。registeredDrivers
是DriverManager的static属性,里面存放着注册的驱动信息。如果这