JDBC 驱动的加载

it2025-02-11  28

最初接触JDBC的时,我是这样加载JDBC驱动的

try { Class.forName("com.mysql.cj.jdbc.Driver"); con=DriverManager.getConnection("jdbc:mysql://localhost:3306/experment1?serverTimezone=Hongkong","root","xxx"); statement=con.createStatement(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }

那么为什么加载一个类就可以直接使用DriverManager连接到数据库呢?

DriverManager都没进行实例化

后来看了源码才恍然大悟

com.mysql.cj.jdbc.Driver

package com.mysql.cj.jdbc; import java.sql.SQLException; public class Driver extends NonRegisteringDriver implements java.sql.Driver { // // Register ourselves with the DriverManager // 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() } }

注意里面的 s t a t i c 代 码 块 \color{red}{static代码块} static,这个是关键

static代码块内的代码在这个类装载的时候就会运行,无需实例化

然后,DriverManager的registerDriver() 也是一个static方法,所以可以直接调用

(前提是我们开始加载JDBC驱动之前导入了java.sql.DriverManager 这个类)

java.sql.DriverManager.registerDriver(new Driver());

上面的语句做的工作就是把JDBC驱动初始化

继续往深的源码我看了也没什么好说的,这就不展开了,有兴趣的朋友再自行查看,这里是链接

之后就可以根据所给的数据库地址,用户名,密码进行数据库连接了

con=DriverManager.getConnection("jdbc:mysql://localhost:3306/experment1?serverTimezone=Hongkong","root","xxx");

J2EE 1.2 (December 12, 1999) J2EE 1.3 (September 24, 2001) J2EE 1.4 (November 11, 2003) Java EE 5 (May 11, 2006) Java EE 6 (December 10, 2009) Java EE 7 (May 28, 2013,[7] but April 5, 2013 according to spec document. June 12, 2013 was the planned kickoff date[8]) Java EE 8 (August 31, 2017[9]) Jakarta EE 8 (September 10, 2019) - fully compatible with Java EE 8[10] Jakarta EE 9 (Target: August 31, 2020)[11][12]

最新回复(0)