java加載jdbc驅動三種方式的比較


一、引言

平時連接數據庫的時候首先要加載jdbc驅動,這一步驟其實有三種方式,他們的區別?優劣?

 

二、快速了解三種加載方式

  1. Class.forName(“com.mysql.jdbc.Driver”);

  2. DriverManager.registerDriver(new com.mysql.jdbc.Driver())

  3. System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);

 

三、代碼實例

1、Class.forName(“com.mysql.jdbc.Driver”)常用

 1 try{
 2        Class.forName("com.mysql.jdbc.Driver");//加載數據庫驅動
 3        String url="jdbc:mysql://localhost:3306/databasename";//數據庫連接子協議
 4        Connection conn=DriverManager.getConnection(url,"username","password");
 5        Statement stmt=conn.createStatement();
 6        ResultSet rs=stmt.executeQuery("select * from tablename");
 7        while(rs.next()){//不斷指向下一條記錄
 8             System.out.println("DeptNo:"+rs.getInt(1));
 9             System.out.println("\tDeptName:"+rs.getString(2));
10             System.out.println("\tLOC:"+rs.getString(3));
11 }         
12     rs.close();
13     stmt.close();
14     conn.close();
15 }catch(ClassNotFoundException e){
16    System.out.println("找不到指定的驅動程序類!");
17 }catch(SQLException e){
18     e.printStackTrace();
19 }

提問:Class.forName(...)不是只是加載類嗎,並沒有看見注冊的操作,為什么這樣就注冊了?

經由博友@梁樺的提醒,去看了下源碼才發現,原來Driver類的靜態代碼塊完成了注冊操作(forName加載類的時候,會執行一次靜態代碼塊)

源碼如下:

  static
  {
    try
    {
      DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
      throw new RuntimeException("Can't register driver!");
    }
  }

 

2、DriverManager,看起來比較直觀的一種方式,注冊相應的db的jdbc驅動,在編譯時需要導入對應的lib

DriverManager.register(new com.mysql.jdbc.Driver());

但是注意了,正如方法1里所說,Driver類的靜態代碼塊會注冊一次,那么此時new Driver的時候就會注冊一次,然后外層又會注冊一次,所以注冊了兩次驅動,實在沒必要,不過直接 new com.mysql.jdbc.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();
}

 

3、通過系統的屬性設置System.setProperty(“jdbc.driver”,”com.mysql.jdbc.Driver”);

 1 try{
 2        System.setProperty("jdbc.driver","com.mysql.jdbc.Driver");//系統屬性指定數據庫驅動
 3        String url="jdbc:mysql://localhost:3306/databasename";//數據庫連接子協議
 4        Connection conn=DriverManager.getConnection(url,"username","password");
 5        Statement stmt=conn.createStatement();
 6        ResultSet rs=stmt.executeQuery("select * from tablename");
 7        while(rs.next()){//不斷指向下一條記錄
 8             System.out.println("DeptNo:"+rs.getInt(1));
 9             System.out.println("\tDeptName:"+rs.getString(2));
10             System.out.println("\tLOC:"+rs.getString(3));
11 }         
12     rs.close();
13     stmt.close();
14     conn.close();
15 }catch(SQLException e){
16     e.printStackTrace();
17 }

 

四、總結

  第二種與第三種注冊的方法看起來更加的直接與好理解。

  但是,第一種與第三種方法可以脫離jdbc的驅動進行編譯,第二種方法是不可以的,它一定要有jdbc的驅動類才可以通過編譯,這樣做十分依賴Jar包,一旦jar包找不到,編譯時期就會報錯,並且為程序換數據庫會帶來麻煩,並且如上所說加載了兩次驅動,雖然這並不影響我們程序,但是這樣做實在是沒有必要,還會影響程序的運行。

  第三種雖然也可以脫離,但是方法參數設置相對來說較為復雜,特點是它可以設置多個驅動,所以在加載單個驅動時,一般采用第一種方法(Class.forName(...))

  第一種方法是通過Class把驅動類Driver先裝載到java的虛擬機中,加載過程中利用靜態代碼塊注冊驅動,好處在於能夠在編譯時不依賴於特定的JDBC Driver庫,也就是減少了項目代碼的依賴性,而且也很容易改造成從配置文件讀取JDBC配置,從而可以在運行時動態更換數據庫連接驅動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM