爲什麼jdbc鏈接時 只要class.forname("com.mysql.jdbc.Driver")即可?

以前都是照本宣科,網上怎麼寫鏈接mysql 就抄過來。。今天覺得無聊,自己看了看mysql driver的源碼類。具體瞭解下其工作原理:


首先class.forname(String className) 這個方法會調用相應的class進行類初始化,一般在java中如果初始化一個類,我們需要對這個類進行實例化,也就是new class()方法。反射也提供這一方式:class.forClass(classname).newInstance(), 這樣會初始化一個無參的構造函數。 那麼這樣是不是初始化jdbc時應寫成:

class.forname("com.mysql.jdbc.Driver").newInstance() ?


測試這樣寫,是OK的。但是爲什麼class.forname("com.mysql.jdbc.Driver") 不實例化對象也可以使用?


其主要原因就是在驅動類中, java doc中任何一個驅動類都需要implements Driver 並且在static 方法中去,註冊driver到 driverManager。

 com.mysql.jdbc.Driver 的源碼:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

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


他在JVM加載類的時候就會執行static方法,該方法會對DriverManager註冊,指定類的對象。所以,其實我們寫class.forName時,真正操作的是類中static方法(且該方法在jvm中加載後就不在重複加載,一次即可),去創建了一個鏈接的對象供我們未來使用。


以後別寫class.forname("com.mysql.jdbc.Driver").newInstance() 啦~。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章