返回

JDBC中 注册驱动 指令的原理详解

第一种方法

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

官方文档解析

在1.6的中文官方文档中可以查看 java.sql包中,有一个管理驱动的类

DriverManger(驱动管理器)

其内部有一个用于注册驱动的方法

registerDriver(Driver driver)

属性为 static void

这就是DriverManager.registerDriver的含义

但是在文档中可以看到Driver drvier是一个接口

而接口对应的实现类应该是数据库对应厂商写的

我们来查看mysql的驱动文件

MySQL驱动文件解析

在mysql的驱动源代码中

src/com/mysql/jdbc中就有Driver.java的文件

同样在Jar包下对应的

com/mysql/jdbc目录下也有Driver.class的文件

内部内容为

package com.mysql.jdbc;

import java.sql.SQLException;

/**
 * Backwards compatibility to support apps that call <code>Class.forName("com.mysql.jdbc.Driver");</code>.
 */
public class Driver extends com.mysql.cj.jdbc.Driver {
    public Driver() throws SQLException {
        super();
    }

    static {
        System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. "
                + "The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.");
    }
}

com.mysql.cj.jdbc.Driver.java

package com.mysql.cj.jdbc;

import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {

    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()
    }
}

父类引用

import java.sql.Driver;
Driver driver = new com.mysql.jdbc.Driver(); //多态,父类型引用指向子类型对象
DriverManger.registDriver(driver);

第二种方法(推荐)

通过查看com.mysql.cj.jdbc.Driver.java文件,发现方法为static方法

所以我们可以通过Class方法快速引用

Class.forName(com.mysql.jdbc.Driver);

异常抛出

根据官方文档,registerDriver会抛出方法SQLException

registerDriver官方方法
registerDriver官方方法

try{
  Driver driver = new com.mysql.jdbc.Driver();
DriverManger.registDriver(driver);
}catch(SQLException e){
  e.printSrackTrace();
}

需要导入的包

import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
comments powered by Disqus