1. 程式人生 > >註冊 Jdbc 驅動程式的三種方式及Class.forName 的作用

註冊 Jdbc 驅動程式的三種方式及Class.forName 的作用

(1)jdbc中註冊驅動,首先匯入對應的包,例如mysql-connector-java-5.0.8-bin.jar驅動包是java和具體資料庫之間的連線橋樑,由資料庫廠商開發。每一種資料庫對應一款驅動jar,甚至每一個版本的資料庫都有自己對應版本的驅動jar

2java.sqlDriverManger類是Java的驅動管理類。管理一組 JDBC 驅動程式

javax.sql.DataSource 介面是 JDBC 2.0 API 中的新增內容,它提供了連線到資料來源的另一種方法。使用 DataSource 物件是連線到資料來源的首選方法。

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進去)從而具體驅動產生了依賴。不方便擴充套件程式碼。 

程式碼如下:

try{        new com.mysql.jdbc.Driver();//建立driver物件,載入資料庫驅動        String url="jdbc:mysql://localhost:3306/databasename";//資料庫連線子協議        Connection conn=DriverManager.getConnection(url,"username","password");        Statement stmt=conn.createStatement();
       ResultSet rs=stmt.executeQuery("select * from tablename");        while(rs.next()){//不斷指向下一條記錄             System.out.println("DeptNo:"+rs.getInt(1));             System.out.println("\tDeptName:"+rs.getString(2));             System.out.println("\tLOC:"+rs.getString(3)); }              rs.close();     stmt.close();     conn.close(); }catch(SQLException e){     e.printStackTrace(); }


(二)System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver"); 

通過系統的屬性設定註冊驅動

如果要註冊多個驅動,則System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver:com.oracle.jdbc.Driver"); 
雖然不會對具體的驅動類產生依賴;但註冊不太方便,所以很少使用。 
程式碼如下:

try{        System.setProperty("jdbc.driver","com.mysql.jdbc.Driver");//系統屬性指定資料庫驅動        String url="jdbc:mysql://localhost:3306/databasename";//資料庫連線子協議        Connection conn=DriverManager.getConnection(url,"username","password");        Statement stmt=conn.createStatement();        ResultSet rs=stmt.executeQuery("select * from tablename");        while(rs.next()){//不斷指向下一條記錄             System.out.println("DeptNo:"+rs.getInt(1));             System.out.println("\tDeptName:"+rs.getString(2));             System.out.println("\tLOC:"+rs.getString(3)); }              rs.close();     stmt.close();     conn.close(); }catch(SQLException e){     e.printStackTrace(); }
(三)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!"); 


就是因為這個程式碼塊,讓類在載入的時候就把驅動註冊進去了! 

程式碼如下:

try{        new com.mysql.jdbc.Driver();//建立driver物件,載入資料庫驅動        String url="jdbc:mysql://localhost:3306/databasename";//資料庫連線子協議        Connection conn=DriverManager.getConnection(url,"username","password");        Statement stmt=conn.createStatement();        ResultSet rs=stmt.executeQuery("select * from tablename");        while(rs.next()){//不斷指向下一條記錄             System.out.println("DeptNo:"+rs.getInt(1));             System.out.println("\tDeptName:"+rs.getString(2));             System.out.println("\tLOC:"+rs.getString(3)); }              rs.close();     stmt.close();     conn.close(); }catch(SQLException e){     e.printStackTrace(); }

附:Class.forName  的作用? 為什麼要用?

        按引數中指定的字串形式的類名去搜索並載入相應的類, 如果該類位元組碼已經被載入過,則返回代表該位元組碼的 Class 例項物件,否則,按類載入器的委託機制去搜索和載入該類,如果所有的類載入器都無法載入到該類,則拋ClassNotFoundException。載入完這個 Class 位元組碼後,接著就可以使用 Class 位元組碼的 newInstance 方法去建立該類的例項物件了。
       有時候,我們程式中所有使用的具體類名在設計時(即開發時)無法確定,只有程式執行時才能確定,這時候就需要使用 Class.forName 去動態載入該類,這個類名通常是在配置檔案中配置的,例如,spring 的 ioc 中每次依賴注入的具體類就是這樣配置的,jdbc 的驅動類名通常也是通過配置檔案來配置的, 以便在產品交付使用後不用修改源程式就可以更換驅動類名。