在學習JDBC的時候,通常有兩種方式去注冊
數據庫驅動程序(這里采用
MySQL數據庫),分別為:
DriverManager.registerDriver(new Driver()); Class.forName("com.mysql.jdbc.Driver"); |
那么這兩種方式有什么異同呢?首先我們到DriverManager中去看一下,
public static synchronized void registerDriver( java.sql.Driver driver) throws SQLException { if (!initialized) { initialize(); } DriverInfo di = new DriverInfo(); di.driver = driver; di.driverClass = driver.getClass(); di.driverClassName = di.driverClass.getName(); // Not Required -- drivers.addElement(di); writeDrivers.addElement(di); println("registerDriver: " + di); /* update the read copy of drivers vector */ readDrivers = (java.util.Vector) writeDrivers.clone(); } |
很明顯,DriverManager將我們需要注冊的驅動程序信息封裝成DriverInfo放進了一個writeDrivers中,這個writeDrivers是DriverManager中聲明的一個static類型Vector變量。在getConnection的時候會再用到。
那么Class.forName("com.mysql.jdbc.Driver")是如何注冊驅動程序的呢,我們知道Class.forName("類名")的主要作用是向虛擬機實例化一個Class實例,我們看一下com.mysql.jdbc.Driver的源代碼。
public class Driver extends NonRegisteringDriver implements java.sql.Driver { // ~ Static fields/initializers // --------------------------------------------- // // Register ourselves with the DriverManager // static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } |
在 com.mysql.jdbc.Driver中有一段靜態(tài)代碼塊,是向 DriverManager注冊一個Driver實例。這樣在 Class.forName("com.mysql.jdbc.Driver")的時候,就會首先去執(zhí)行這個靜態(tài)代碼塊,于是和DriverManager.registerDriver(new Driver())有了相同的效果。
那么對于這兩種方法,在這里,我推薦使用第二種,即Class.forName("類名")的方式。原因有兩點
1、在我們執(zhí)行DriverManager.registerDriver(new Driver())的時候,靜態(tài)代碼塊也已經執(zhí)行了,相當于是實例化了兩個Driver對象。
2、 DriverManager.registerDriver(new Driver())產生了一種對MySQL的一種依賴。而Class.forName的方式我們完全可以在運行的時候再動態(tài)改變。