關於驅動包
jdbc中注冊驅動,首先導入對應的包,例如mysql-connector-java-5.0.8-bin.jar。驅動包是java和具體數據庫之間的連接橋梁,由數據庫廠商開發。每一種數據庫對應一款驅動jar,甚至每一個版本的數據庫都有自己對應版本的驅動jar。
關於java.sqlDriverManger類
Java的驅動管理類。管理一組 JDBC 驅動程序。
javax.sql.DataSource 接口是 JDBC 2.0 API 中的新增內容,它提供了連接到數據源的另一種方法。使用 DataSource 對象是連接到數據源的首選方法。
更深的理解請參見java 文檔。
DiverManager.class里有個屬性drivers,它實際上是一個vector(向量)。可在列表中加入很多驅動,當DriverManager去取連接的時候,若果drivers里有很多驅動,它會把drivers里面的各個驅動的url和創建連接時傳進來的url逐一比較,遇到對應的url,則建立連接。
注冊驅動的三種方式:
(一)DriverManager.registerDriver(new com.mysql.jdbc.Driver());
會造成DriverManager中產生兩個一樣的驅動,並會對具體的驅動類產生依賴。
具體來說就是:
1,加載的時候注冊一次驅動(原因請看第三中注冊方式),實例化的時候又注冊一次。所以兩次。
2,由於實例化了com.mysql.jdbc.Driver.class,導致必須導入該類(就是要把這個類import進去),從而具體驅動產生了依賴。不方便擴展代碼。
(二)System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");
通過系統的屬性設置注冊驅動
如果要注冊多個驅動,則System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver:com.oracle.jdbc.Driver");
雖然不會對具體的驅動類產生依賴;但注冊不太方便,所以很少使用。
(三)Class.forName("com.mysql.jdbc.Driver");( 關於這句代碼的進一步理解請參看另一篇文章《從Class.forName()到類的裝載機制》)
推薦這種方式,不會對具體的驅動類產生依賴(就是不用import package了)。
其實這個只是把com.mysql.jdbc.Driver.class這個類裝載進去,但是關鍵就在於,在
這個類中,有個靜態塊,如下:
static{
try{
java.sql.DriverManager.registerDriver(new Driver());
}catch(SQLException e){
throw new RuntimeException("can't register driver!");
}
}
就是因為這個代碼塊,讓類在加載的時候就把驅動注冊進去了!