![](/img/trans.png)
[英]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.