1.Class.forName("com.mysql.jdbc.Driver");
3.System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
DriverManager.registerDriver和 Class.forName()的異同
那么這兩種方式有什么異同呢?首先我們到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中有一段靜態代碼塊,是向 DriverManager注冊一個Driver實例。這樣在Class.forName("com.mysql.jdbc.Driver")的時候,就會首先去執行這個靜態代碼塊,於是和DriverManager.registerDriver(new Driver())有了相同的效果。
那么對於這兩種方法,在這里,我推薦使用第二種,即Class.forName("類名")的方式。原因有兩點
1、在我們執行DriverManager.registerDriver(new Driver())的時候,靜態代碼塊也已經執行了,相當於是實例化了兩個Driver對象。
2、 DriverManager.registerDriver(new Driver())產生了一種對MySQL的一種依賴。而Class.forName的方式我們完全可以在運行的時候再動態改變。