我们在学习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类。