簡體   English   中英

這究竟做了什么Class.forName(“com.mysql.jdbc.Driver”)。newInstance();

[英]what exactly does this do Class.forName(“com.mysql.jdbc.Driver”).newInstance();

連接到MySQL數據庫時,我執行以下步驟

Connection con = null;
Resultset rs = null;
Statement st = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","root","passwp");

其實我想知道Class.forName("com.mysql.jdbc.Driver").newInstance(); 聲明做。

Althogh這個類不在mysql.jar中。 它在哪里?

Class類位於java.lang包中,因此它與java一起分發,並自動導入到每個類中。

forName()方法的作用是返回類加載器加載的參數的Class對象。 然后newInstance()方法返回該類的新實例。

那么接下來發生的是調用Class.forName(...)它返回com.mysql.jdbc.Driver.class。 然后你在該類上調用newInstance() ,該類返回一個類的實例,沒有參數,所以它基本上調用了new com.mysql.jdbc.Driver();

如果在類路徑中找到它,則初始化類"com.mysql.jdbc.Driver" ,這意味着驅動程序在JDBC驅動程序管理器中注冊,因為注冊過程在驅動程序類的靜態初始化程序內...

您可以使用另一種方法來注冊驅動程序:是使用靜態DriverManager.registerDriver()方法。

引用JDBC規范 ,第9章第2節:

JDBC驅動程序必須實現Driver接口,並且實現必須包含將在加載驅動程序時調用的靜態初始化程序。 此初始化程序使用DriverManager注冊其自身的新實例。

並為AcmeJdbcDriver提供了一個示例代碼,如下所示:

public class AcmeJdbcDriver implements java.sql.Driver {
    static {
        java.sql.DriverManager.registerDriver(newAcmeJdbcDriver());
    }
}

當您調用Class.forName(String className)時 ,根據API文檔,會發生以下情況:

對forName(“X”)的調用會導致名為X的類被初始化。

初始化涉及要執行的靜態塊中的代碼。

所以基本上,你初始化Driver類,反過來,類根據JDBC規范使用java.sql.DriverManager注冊自己。

請注意,這不再需要了。 細節可以在這里找到。

DriverManager方法getConnection和getDrivers已得到增強,可支持Java Standard Edition Service Provider機制。 JDBC 4.0驅動程序必須包含文件META-INF / services / java.sql.Driver。 此文件包含java.sql.Driver的JDBC驅動程序實現的名稱。 例如,要加載my.sql.Driver類,META-INF / services / java.sql.Driver文件將包含以下條目:

 my.sql.Driver 

應用程序不再需要使用Class.forName()明確加載JDBC驅動程序。

它將創建com.mysql.jdbc.Driver類的新實例,因此調用靜態初始化,它將使用DriverManager注冊驅動程序,以便您可以根據在第二行中使用的URL創建mysql連接。

但是該類應該在mysql.jar

它創建com.mysql.jdbc.Driver類的新實例並注冊驅動程序。

那么接下來發生的事情就是調用Class.forName(“com.mysql.jdbc.Driver”)而不使用'newInstance()'它返回com.mysql.jdbc.Driver類並僅注冊驅動程序

暫無
暫無

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

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