【Java學習】Jdbc注冊驅動的三種方式


關於驅動包

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 }

轉載:https://www.cnblogs.com/chenning/p/5030790.html


免責聲明!

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



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