關於驅動包
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!");
}
}
就是因為這個代碼塊,讓類在加載的時候就把驅動注冊進去了!
*****首先下載mysql jar包,放到jre lib目錄下
1 package com.company; 2 3 import java.sql.*; 4 5 6 public class TestMySQL { 7 // MySQL 8.0 以下版本 - JDBC 驅動名及數據庫 URL 8 // static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 9 // static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB"; 10 11 // MySQL 8.0 以上版本 - JDBC 驅動名及數據庫 URL 12 static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; 13 static final String DB_URL = "jdbc:mysql://localhost:3306/mysql?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; 14 15 16 // 數據庫的用戶名與密碼,需要根據自己的設置 17 static final String USER = "root"; 18 static final String PASS = "root"; 19 20 public static void main(String[] args) { 21 Connection conn = null; 22 Statement stmt = null; 23 try { 24 // 注冊 JDBC 驅動 25 Class.forName(JDBC_DRIVER); 26 27 // 打開鏈接 28 System.out.println("連接數據庫..."); 29 conn = DriverManager.getConnection(DB_URL, USER, PASS); 30 31 // 執行查詢 32 System.out.println("實例化Statement對象..."); 33 stmt = conn.createStatement(); 34 String sql; 35 sql = "select max_questions, user, host from mysql.user"; 36 ResultSet rs = stmt.executeQuery(sql); 37 38 // 展開結果集數據庫 39 while (rs.next()) { 40 // 通過字段檢索 41 int max_questions = rs.getInt("max_questions"); 42 String user = rs.getString("user"); 43 String host = rs.getString("host"); 44 45 // 輸出數據 46 System.out.print("max_questions: " + max_questions); 47 System.out.print(", user: " + user); 48 System.out.print(", host: " + host); 49 System.out.print("\n"); 50 } 51 // 完成后關閉 52 rs.close(); 53 stmt.close(); 54 conn.close(); 55 } catch (SQLException se) { 56 // 處理 JDBC 錯誤 57 se.printStackTrace(); 58 } catch (Exception e) { 59 // 處理 Class.forName 錯誤 60 e.printStackTrace(); 61 } finally { 62 // 關閉資源 63 try { 64 if (stmt != null) stmt.close(); 65 } catch (SQLException se2) { 66 }// 什么都不做 67 try { 68 if (conn != null) conn.close(); 69 } catch (SQLException se) { 70 se.printStackTrace(); 71 } 72 } 73 System.out.println("Goodbye!"); 74 } 75 }