簡體   English   中英

更好的理解 - Class.forName(“com.mysql.jdbc.Driver”)。newInstance();

[英]Better understaning - Class.forName(“com.mysql.jdbc.Driver”).newInstance ();

我遇到了這個有用的鏈接,代碼在更新時可以很好地運行,可以點擊我的網絡服務器。 我絕對可以做到一切。

現在,我唯一不完全理解的是Class.forName()

為什么要使用它? 可以這樣做嗎? 這是一個解決其他問題的工作嗎? 添加參考? 創建一個類來實現/擴展另一個類?

我想完全理解發生了什么,但這是我的方式。

謝謝

該代碼強制表示MySQL驅動程序的類加載和初始化。 在Java中,除非必須加載類,否則不會加載類。 由於JDBC代碼通常永遠不會直接引用驅動程序,因此如果沒有Class.forName (或其他一些等效的替代方法),它就不會被加載。

請注意,有必要加載初始化類,這是兩個不同的東西。

另外,請注意,不必調用.newInstance() - 驅動程序的靜態初始化程序已將自身注冊為JDBC驅動程序。

最后,請注意,使用Service Loader API時 ,通常不需要調用Class.forName()來加載驅動程序:它可以自動加載。

Class.forName(className)使用指定的className加載類。

以這種方式加載JDBC驅動程序以避免必須對特定JDBC驅動程序具有編譯時依賴性。 我們的想法是使用Java的JDBC API(包java.sqljavax.sql定義的類和接口),而不必直接引用特定的JDBC驅動程序。

當您讓Java使用forName調用加載驅動程序類時,驅動程序將自行注冊以便可以使用它。

請注意,對於大多數JDBC驅動程序,不必顯式創建驅動程序類的新實例; 你可以不用.newInstance()調用。

請注意,自JDBC 4.0版以來,不再需要Class.forName()調用 - 改進了發現驅動程序的過程,JDBC可以自動加載它們。

所有JDBC驅動程序都有一個靜態塊,它使用DriverManager注冊自己,而DriverManager只有靜態初始化程序。

MySQL JDBC驅動程序有一個靜態初始化程序,如下所示:

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

JVM執行靜態塊,驅動程序使用DriverManager注冊自身。 您需要數據庫連接來操作數據庫。 為了創建與數據庫的連接,DriverManager類必須知道要使用哪個數據庫驅動程序。 它通過遍歷已向其注冊的驅動程序的數組(內部為Vector)並在數組中的每個驅動程序上調用acceptsURL(url)方法來實現,有效地要求驅動程序告訴它是否可以處理JDBC URL。

您可以使用例如:

import com.mysql.jdbc.Driver;

public class MyClass {
   //[...]
   public void myMethod() {
        Class<Driver> clz = Driver.class;
        Driver driver = clz.newInstance();
   }
}

但這不是那么靈活; 例如,您可以從配置文件中讀取名稱“com.mysql.jdbc.Driver”。 也許您想要使用其他驅動程序(來自Oracle)並且您不想更改代碼; 以上面給出的方式,這是不可能的,所以正確的方法是使用Class.forName(name)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM