2016-01-13 65 views
0

在建立數據庫連接的情況下,我們通常導入所需的軟件包和使用的Class.forName()被調用類的類加載器加載所需的驅動程序類。的Class.forName(Driver.class)

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
.... 
.... 
Class.forName("com.mysql.jdbc.Driver"); 
Connection con=DriverManager.getConnection(...); 

不能我們只是掉落的Class.forName()如本: -

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import com.mysql.jdbc.*; 
.... 
.... 

Connection con=DriverManager.getConnection(...); 

當一個類的依賴性是由加載的依賴同樣的類加載器加載我的問題是類,通過與Class.forName(className)隱式使用一起使用的相同機制,爲什麼要顯式給出Class.forName()。只需在導入語句中包含驅動程序類。 驅動程序類在創建DriverManager.getConnection()行時是否會自動加載? com.mysql.jdbc包在import語句中。 或者我需要添加像

Class clazz=com.mysq.jdbc.Driver.class 

人行觸發的Class.forName()。

回答

1

import聲明沒有做在運行時什麼。它甚至不是編譯類的一部分。它只是告訴編譯器在哪裏尋找東西。

Class<?> dummy = com.mysql.jdbc.Driver.class這樣的一行可以工作,但是你對MySQL驅動JAR文件(哪個Class.forName沒有,但在宏觀方案中可能不是壞事)具有編譯時間依賴性。

+0

那麼像「類虛擬」這樣的線如何幫助加載類?對Class.forName()的調用是否隱式進行?誰打電話?或者,該行簡單地被Class.forName(com.mysql.jdbc.Driver.class)取代,在這種情況下,這將不再是編譯時依賴性? – prvn

+0

如果你引用一個類,它將被加載。對於JDBC驅動程序,只需將其註冊到驅動程序管理器即可。當你在代碼中引用一個類時(比如'new Arraylist ()'或'com.mysql.jdbc.Driver.class'),JVM會自動加載類(如果還沒有完成的話)。 – Thilo

3

首先,加載驅動程序類沒有必要了,因爲Java有一個內置的服務提供商加載機制,看起來在類路徑的jar文件查找可用的驅動程序。

只導入一個類不足以加載它。導入的所有功能都允許您在編譯時使用簡單名稱而不是其完全限定名稱來引用類。但是如果你從來沒有真正加載過類,它什麼都不會做。

您確實可以在不使用反射的情況下加載該類,但這意味着您需要將驅動程序作爲編譯時依賴項,這通常是不需要的:您不應該依賴驅動程序中特定於數據庫的類,但僅限於標準JDBC接口。在編譯類路徑中沒有驅動程序可以確保。

+0

「不再需要加載驅動程序類」。不過,我從來沒有見過這樣的工作。:-(這隻有在驅動程序JAR文件位於系統類路徑上(而不是動態加載的東西)時纔有效嗎? – Thilo

+1

我想是的,我幾乎從不使用DriverManager,並且總是通過連接池,所以我不有很多具體的經驗。 –

2

只要您的驅動程序是JDBC 4.0兼容,您不需要Class.forName()。 請閱讀introduction on DriverManager JavaDoc瞭解如何處理。

原因,司機仍然需要在classpath。 Class.forName()也是如此(否則會拋出ClassNotFoundException

相關問題