JDBC注册驱动的两种方式

330 阅读1分钟

我们在学习JDBC的时候,会知道有两种方式注册数据库驱动程序:

Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver); //注册驱动

或者是

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

很自然的,我们就会想知道这两种方式有什么不同,我们应该使用哪一种方式来注册驱动?

首先我们先去看看DriverManager的registerDriver方法的源码

public static void registerDriver(java.sql.Driver driver)
    throws SQLException {

    registerDriver(driver, null);
}
public static void registerDriver(java.sql.Driver driver,
        DriverAction da)
    throws SQLException {

    /* Register the driver if it has not already been added to our list */
    if (driver != null) {
        registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
    } else {
        // This is for compatibility with the original DriverManager
        throw new NullPointerException();
    }

    println("registerDriver: " + driver);

}

我们可以看到,Driver和DriverAction被封装成DriverInfo对象,然后判断该驱动是否存在,如果不存在的话,就把注册该驱动。

接下来,我们来看看com.mysql.cj.jdbc.Driver类:

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}

我们会看到该类里面有一个静态代码块,也就是上面所展示的代码。静态代码块部分注册了驱动。

由此,我们知道两种方式实现的效果都是一样的。

注:上面源码是jdk-14.0.2的。要注意的话,之前的jdk版本源码部分和当前的源码部分略有不同。

这样的话,我们到底应该使用哪种方式注册驱动呢?

推荐使用 Class.forName()的方式,因为这种方式不会对具体的驱动类产生依赖,而且可以在运行时改变驱动类。

相比之下,另一种方式依赖了com.mysql.cj.mysql.Driver类。