為什么不用DriverManager.registerDriver(driver)
Class.forName()與JDBC沒有直接關系。它只是加載一個類。

大多數JDBC驅動程序類通過調用在自己的靜態初始化器中注冊自己registerDriver()。
registerDriver() 是真正不需要調用的真正調用(除非您編寫自己的JDBC驅動程序)。
請注意,在JDBC 4 中,如果您的JDBC驅動程序是最新的,則不需要它們中的任何一個,因為可以使用服務定位機制找到驅動程序(即,只需忽略該調用并照常打開連接)即可。有關詳細信息,請參見文檔Drivermanager:
在Drivermanager的方法getConnection和getDrivers已得到增強,支持Java標準版服務提供商的機制。JDBC 4.0驅動程序必須包含該文件META-INF/services/java.sql.Driver。該文件包含的JDBC驅動程序實現的名稱java.sql.Driver。例如,要加載my.sql.Driver類,META-INF/services/java.sql.Driver文件將包含以下條目:
my.sql.Driver
應用程序不再需要使用顯式加載JDBC驅動程序Class.forName()。當前使用JDBC驅動程序加載的現有程序Class.forName()將繼續運行而無需進行修改。
切勿DriverManager.registerDriver()手動調用方法。JDBC規范要求驅動程序在類加載時進行注冊,并通過加載該類Class.forName()。在JDBC 4中,僅在類路徑上就可以自動加載驅動程序。
DriverManager.registerDriver()手動操作有潛在危險,因為它實際上會使驅動程序注冊兩次。如果您的代碼要求您注銷驅動程序以防止內存泄漏,那么您最終只會注銷一次,并保留第二個實例的注冊狀態。
--*************************************************
在實際開發中,程序中不直接去訪問實現了 Driver 接口的類,而是由驅動程序管理器類(java.sql.DriverManager)去調用這些Driver實現。
DriverManager 類是驅動程序管理器類,負責管理驅動程序。
通常不用顯式調用 DriverManager 類的 registerDriver() 方法來注冊驅動程序類的實例。
//DriverManager.registerDriver()方式注冊驅動,還是依賴
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName()或ClassLoader對象.loadClass()
因為 Driver 接口的驅動程序類都包含了靜態代碼塊,在這個靜態代碼塊中,會調用 DriverManager.registerDriver() 方法來注冊自身的一個實例,所以可以換一種方式來加載驅動。(即只要想辦法讓驅動類的這段靜態代碼塊執行即可注冊驅動類,而要讓這段靜態代碼塊執行,只要讓該類被類加載器加載即可)
調用 Class 類的靜態方法 forName(),向其傳遞要加載的 JDBC 驅動的類名
//1、通過反射,加載與注冊驅動類,解耦合(不直接依賴)
Class.forName(“com.mysql.jdbc.Driver”);
//2、通過類加載器加載驅動類,解耦合(不直接依賴)
ClassLoader.getSystemClassLoader().loadClass(“com.mysql.jdbc.Driver”);
反射:? ? ? ? ? ? ? Class.forName("com.mysql.jdbc.Driver")
new方法:? ? ? ? Driver driver = new Driver();//com.mysql.jdbc.Driver
DriverManager.registerDriver(driver);
查看Driver源碼
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
ok,就是說其實起作用的是這一句代碼:
java.sql.DriverManager.registerDriver(new Driver());
第2種方式 Driver driver = new Driver() ?其在內部也執行靜態代碼塊,這相當于實例化了兩個Driver對象;
第2種方式?Driver driver = new Driver() 會產生對某一種數據庫的依賴(會import驅動包),當脫離masql的jar的時程序將無法編譯,耦合性較高。
反射:
反射可避免對某一類產生依賴,使耦合性降低
JDBC
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。