偶爾會突然短路,想着爲什麼Class.forName(${DriverName}); DriverManager裏就有註冊了這個數據庫的驅動呢?
這是因爲,我們在思考 註冊數據庫驅動 的時候,總是想着我們自己去註冊,如果沒有顯式的去做,就不自在。 這還是因爲沒有一個OO的思想。
其實呢,註冊數據庫驅動這個動作,sun只提供了註冊的動作,其餘的是誰註冊它並不關心,這樣呢,它就是一個服務提供者,我提供註冊的服務給你,你自己去註冊就好了。
就像加油站,我給加油站以及加油的龍頭在那,你沒油了你自己去拿着龍頭加油。我不需要知道你這是桑塔納還是水泥車還是寶馬。
sun提供給你這個接口,你們數據庫提供商就自己拿去註冊。
下面是代碼:
sun提供的數據庫驅動管理類:
public static synchronized void registerDriver(Driver driver)
throws SQLException
{
registerDriver(driver, null);
}
mysql提供的驅動類:(Class.forName()是讓JVM去查找指定的類(初始化),並沒有實例化,只不過是把類加載到了JVM中。但是由於靜態代碼和class是在方法區中的,在初始化的時候就會全部執行一次且以後不再執行,所以當初始化時,會加載以下代碼中的static片段,即→註冊數據庫驅動方法)
public class Driver extends NonRegisteringDriver
implements java.sql.Driver
{
public Driver()
throws SQLException
{
}
static
{
try
{//mysql的驅動自己拿着sun的驅動管理類進行了註冊。我們在使用的時候只要把這個類初始化就行了。
DriverManager.registerDriver(new Driver());
}
catch(SQLException E)
{
throw new RuntimeException("Can't register driver!");
}
}
}