數據庫操作是後端開發的核心技能。本文以 Oracle 為例,通過一個極簡的「查詢用戶」Demo,逐行拆解 JDBC 連接的完整生命周期,剖析 DriverManager、Connection、PreparedStatement、ResultSet 四大核心對象的職責與協作關係,並給出生產環境的遷移建議。
package com.java.dbtest;
import java.sql.*;
public class TestConnection {
public void selectUser() {
// 1. 連接參數
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:BJPOWERNODE";
String user = "system", password = "bjpowernode";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 2. 加載驅動
Class.forName(driver);
// 3. 建立連接
conn = DriverManager.getConnection(url, user, password);
System.out.println("連接成功: " + conn); // oracle.jdbc.driver.T4CConnection@...
// 4. 預編譯 SQL
String sql = "select * from t_user where user_id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "root"); // 綁定參數
// 5. 執行查詢
rs = pstmt.executeQuery();
// 6. 處理結果集
if (rs.next()) {
System.out.println("查詢到用戶: " + rs.getString("user_id") + ", 密碼: " + rs.getString("password"));
} else {
System.out.println("未查詢到用戶");
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
// 7. 逆序關閉資源
closeQuietly(rs);
closeQuietly(pstmt);
closeQuietly(conn);
}
}
private void closeQuietly(AutoCloseable c) {
if (c != null) try { c.close(); } catch (Exception ignored) {}
}
public static void main(String[] args) { new TestConnection().selectUser(); }
}
DriverManager 註冊自己。META-INF/services/java.sql.Driver,可省略此行。getConnection(url, user, pwd) 遍歷驅動,調用 driver.connect(url, props) 返回 Connection。Statement,SQL 發送至數據庫預編譯,生成執行計劃緩存。? + setXxx(index, val) 綁定,數據與代碼分離。addBatch() + executeBatch() 大幅提升寫入吞吐。next() 移動到下一行,返回 true 表示有數據。getString(colIndex/Name)、getInt()、getDate() 等,支持按索引或列名。TYPE_FORWARD_ONLY、CONCUR_READ_ONLY(只進、只讀),可構造時指定滾動/可更新類型。// 必須在 finally 中關閉,順序:ResultSet → Statement → Connection
try { /* 業務邏輯 */ }
finally {
close(rs); close(pstmt); close(conn);
}
// Java 7+ try-with-resources 自動關閉 (實現 AutoCloseable)
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
// 業務邏輯
}
maximumPoolSize、minimumIdle、connectionTimeout、idleTimeout、maxLifetime。application.yml,支持多環境。@Transactional 聲明式事務,替代手動 commit/rollback。select *、显式列出字段;複雜查詢用 EXPLAIN PLAN 分析執行計劃。JDBC 是 Java 訪問關係型數據庫的基石。理解 DriverManager → Connection → PreparedStatement → ResultSet 的調用鏈路與資源管理鐵律,是寫出正確、高效、安全數據訪問代碼的前提。實戰中請堅決拋棄 DriverManager,擁抱連接池與 ORM 框架,將精力集中在業務邏輯與 SQL 優化上。