4 回答
TA貢獻1803條經驗 獲得超6個贊
這個問題翻一下兩個類的源碼就可以很清楚的了解了。
不過首先你的明白Class.forName()的作用,這個是用來加載指定類的。
為什么需要手動去加載呢?正常情況下對于一個Java程序來說我們不需要去管某個類的加載,只需要在用來的時候import進去即可,但是對于JDBC的設計是不一樣的,你可以從你的數據庫連接代碼中發現,DriverManage在決定使用哪個驅動的時候并不是由開發者指定的,而是通過遍歷所有已注冊的驅動來嘗試獲取連接,成功就返回,失敗就next,所以代碼中并沒有顯示的指定驅動,這一點可以從DriverManage的源碼中可以看到。
for(DriverInfo aDriver : registeredDrivers) {
// If the caller does not have permission to load the driver then
// skip it.
if(isDriverAllowed(aDriver.driver, callerCL)) {
try {
println(" trying " + aDriver.driver.getClass().getName());
Connection con = aDriver.driver.connect(url, info);
if (con != null) {
// Success!
println("getConnection returning " + aDriver.driver.getClass().getName());
return (con);
}
} catch (SQLException ex) {
if (reason == null) {
reason = ex;
}
}
} else {
println(" skipping: " + aDriver.getClass().getName());
}
}
這個類基本可以明白JDBC是如何獲取連接的,問題是registeredDrivers是怎么來的,從DriverManager的源碼中只能夠發現一個registerDriver方法可以往registeredDrivers中注冊驅動,所以自然是由驅動類自行將自己注冊到registeredDrivers中,這一點可以通過查看com.mysql.jdbc.Driver類源碼得到證實。
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
這個是jdbc.Driver的一段static代碼,這段代碼在類加載時會自動執行,所以就把自己注冊到DriverManage的registerDriver中了,這樣整個流程就全部通了。
綜上,不懂得問題翻翻代碼就清楚了,多動手。
TA貢獻1854條經驗 獲得超8個贊
class.forName("com.mysql.jdbc.Driver")會在classpath中查找并加載這個類。一旦com.mysql.jdbc.Driver被加載并連接后,就自動執行static靜態代碼塊,這時就可以做一些初始化的工作了,最主要的作用就是執行java.sql.DriverManager.registerDriver()來注冊驅動。如果沒有class.forName這一步,就會報找不到合適的驅動程序。
添加回答
舉報
