JDBC的驱动注册浅析
JDBC驱动类是一个接口——java.sql.Driver。这个接口是给实现JDBC接口的各个数据库实现的。
我们使用JDBC的时候,会有一行代码(参见Mysql数据库的JDBC查询实例或Oracle数据库的JDBC查询实例 ):
Class.forName(JDBC_DRIVER);
它起到的作用就是加载具体实现的jar包中实现Driver的具体子类,类加载的过程中会调用static方法块的代码,数据库驱动的注册就在该static块中。如果不用Class的forName方法,直接实例化Driver对象也行,实例化自然也会去加载static块。
1、Mysql:
驱动类是com.mysql.jdbc.Driver,它先通过继承com.mysql.cj.jdbc.Driver,最终调用了JDBC的API:DriverManager.registerDriver方法。注意static块里打印的那行字:Loading...这行字只有com.mysql.jdbc.Driver类初始化时才会打印。
2、Oracle:
驱动类是oracle.jdbc.driver.OracleDriver:
以上是通过类加载的方式来注册数据库驱动,现在常用的还有一种——SPI机制(参见Java的SPI简单实例)。
我们先把Mysql数据库的JDBC查询实例 中的Class.forName那一行注掉,再跑一次:
可以看到照样可以跑起来,只不过少打印了那几行字:
回到正文的开始,我们发现这几行红字是通过Class.forName方式加载才会出现,如果是使用SPI机制加载,并不会走到com.mysql.jdbc.Driver这里来,直接去com.mysql.cj.jdbc.Driver那里去了: