一、引言
平時連接數據庫的時候首先要加載jdbc驅動,這一步驟其實有三種方式,他們的區別?優劣?
二、快速了解三種加載方式
-
Class.forName(“com.mysql.jdbc.Driver”);
-
DriverManager.registerDriver(new com.mysql.jdbc.Driver())
-
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配置,從而可以在運行時動態更換數據庫連接驅動。