文章目錄
- 基本流程
- 注冊驅動的兩種方法
- DriverManager
- DriverManager 的核心作用
- 核心原理
- 自動注冊驅動的機制
- 關鍵方法
- 示例代碼: 連接Mysql數據庫
- Statement
- PreparedStatement
JDBC全稱Java DataBase Connectivity。
定義: JDBC 是 Java 語言中用于連接和執行 SQL 操作的標準接口。
功能: 提供統一的方式訪問關系型數據庫(如 MySQL、Oracle、PostgreSQL 等)。
核心包: java.sql 和 javax.sql。
基本流程
- 加載并注冊驅動
- 建立數據庫連接
- 創建 Statement 對象
- 執行sql語句
- 處理結果集 (ResultSet)
- 釋放資源 (直接close)
注冊驅動的兩種方法
以mysql為例
第一種:
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
- 手動創建一個驅動實例,并顯式注冊到
DriverManager
中 DriverManager
會將這個驅動添加到它的驅動列表中,以便后續用getConnection()
建立數據庫連接。
第二種(推薦)
Class.forName("com.mysql.cj.jdbc.Driver")
- 利用 Java 的反射機制加載這個類,并執行它的靜態代碼塊
com.mysql.cj.jdbc.Driver
的靜態代碼塊中已經調用了
DriverManager.registerDriver(new Driver());
所以自動完成了驅動注冊。
DriverManager
DriverManager
是 Java JDBC(Java Database Connectivity)API 的核心類之一,它負責管理數據庫驅動并協調應用程序與數據庫之間的連接。
DriverManager 的核心作用
功能 | 說明 |
---|---|
驅動注冊 | 接受驅動類注冊(DriverManager.registerDriver() ) |
驅動管理 | 內部維護一個已注冊驅動的列表 |
獲取連接 | 通過 getConnection() 方法,找到能處理特定 JDBC URL 的驅動并返回連接 |
核心原理
驅動注冊機制
- JDBC 驅動類實現了
java.sql.Driver
接口 - 驅動類的靜態代碼塊中通常會調用:
DriverManager.registerDriver(new Driver());
這就把該驅動對象注冊到 DriverManager
的內部驅動列表中。
- 也可以手動注冊:
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
驅動列表
DriverManager
內部維護了一個List<Driver>
,用于存儲所有注冊的 JDBC 驅動- 這個列表是線程安全的(使用了同步機制)
獲取連接
getConnection() 的調用
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "pass");
執行流程如下:
-
- 遍歷內部注冊的驅動列表
- 每個驅動調用
acceptsURL(url)
判斷是否支持這個 URL - 找到支持的驅動后,調用它的
connect()
方法返回一個Connection
對象 - 如果沒有任何驅動支持這個 URL,會拋出
SQLException
自動注冊驅動的機制
從 JDBC 4.0 開始(Java 6 起),支持SPI 自動注冊機制:
- 驅動 JAR 包中包含
META-INF/services/java.sql.Driver
文件 - 文件內容為驅動的全限定類名,如:
com.mysql.cj.jdbc.Driver
- 當類加載器加載驅動 jar 時,JDK 會自動加載并注冊驅動類,無需顯式寫
Class.forName(...)
所以可以直接寫:
Connection conn = DriverManager.getConnection(...);
關鍵方法
方法 | 說明 |
---|---|
getConnection(String url, String user, String password) | 根據 URL、用戶名、密碼獲取數據庫連接 |
getDrivers() | 獲取當前已注冊的所有驅動 |
registerDriver(Driver driver) | 手動注冊驅動(通常不需要直接調用) |
deregisterDriver(Driver driver) | 從注冊列表中移除驅動 |
getDrivers() | 獲取所有已注冊的驅動實例 |
setLogWriter(PrintWriter) | 設置日志輸出流 |
setLoginTimeout(int seconds) | 設置連接超時時間 |
示例代碼: 連接Mysql數據庫
package JDBC;import java.sql.*;public class demo1 {public static void main(String[] args) {String url="jdbc:mysql://localhost:3307/test";String user="root";String password="root";try{//1.加載驅動Class.forName("com.mysql.cj.jdbc.Driver");//2.建立連接Connection conn= DriverManager.getConnection(url,user,password);//3.創建StatementStatement stmt = conn.createStatement();//4.執行sql語句ResultSet rs = stmt.executeQuery("select * from users");//5.處理結果集while(rs.next()){String username = rs.getString("user");//列名的方式String pass = rs.getString(2);//列下標的方式System.out.println("username:"+username+" password:"+pass);}//6.關閉資源rs.close();stmt.close();conn.close();}catch (Exception e){e.printStackTrace();System.out.println(e.getMessage());}}
}
Statement
Statement sql語句的主要操作函數有三個
executeQuery() //執行select查詢語句
executrupdate() //可以執行insert,update,delect,CREATE 之類的
execute() //執行任意語句
PreparedStatement
PreparedStatement其sql語句是在其獲取命令執行對象時就以及寫入了預編譯語句。其要進行sql執行只要對其參數進行傳入即可
PreparedStatement pstmt = conn.prepareStatement("select * from users where user=?");
pstmt.setString(1,"xpw");
ResultSet rs2 = pstmt.executeQuery();
rs2.next();
System.out.println("預編譯查詢\t用戶名:"+rs2.getString("user")+" 密碼:"+rs2.getString("password"));//預編譯查詢 用戶名:xpw 密碼:123
需要注意的是所得到的ResultSet類的實例,其初始的索引是不在第一行的,我們想獲取內容需要先使用next使得索引內移