首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 數據庫編程核心:JDBC 基礎操作與進階技巧全解析

     編輯:Java 相關知識

JDBC 標準操作四步走

  1. 獲取連接:DriverManager 或 JNDI DataSource(推薦生產環境用連接池)。
  2. 執行 SQL:Statement(靜態 SQL)或 PreparedStatement(參數化、防注入、預編譯優化)。
  3. 處理結果:查詢返回 ResultSet,更新返回影響行數。
  4. 釋放資源:順序固定:ResultSet → Statement → Connection,建議用 try-with-resources 自動關閉。

關鍵進階技巧

1. 可滾動、可更新的 ResultSet

// 滾動且只讀
Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE, 
    ResultSet.CONCUR_READ_ONLY
);
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
rs.absolute(9000); // 直接跳轉第 9000 行

// 可更新
PreparedStatement ps = conn.prepareStatement(sql,
    ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE);
ResultSet rs = ps.executeQuery();
rs.updateString("name", "NewName");
rs.updateRow(); // 寫回數據庫

TYPE_SCROLL_INSENSITIVE:結果集開啟後不感知底層數據變化;SENSITIVE 則可見實時變更(性能較差)。

2. 批量更新

Statement 批量:多條不同 SQL 一次提交:

Statement stmt = conn.createStatement();
stmt.addBatch("INSERT INTO log VALUES (1, 'a')");
stmt.addBatch("UPDATE user SET cnt=cnt+1 WHERE id=1");
stmt.addBatch("DELETE FROM temp WHERE expired=1");
int[] counts = stmt.executeBatch(); // 返回各條影響行數

PreparedStatement 批量:同一 SQL,不同參數集批量執行:

PreparedStatement ps = conn.prepareStatement("INSERT INTO user(id,name) VALUES(?,?)");
for (User u : users) {
    ps.setInt(1, u.getId());
    ps.setString(2, u.getName());
    ps.addBatch();
}
int[] counts = ps.executeBatch();

批量操作大幅減少網絡往返,插入萬條數據可從分鐘級降至秒級。

3. 事務處理

conn.setAutoCommit(false); // 關閉自動提交
try {
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("INSERT INTO orders ..."); stmt.close();
    stmt = conn.createStatement();
    stmt.executeUpdate("UPDATE inventory SET qty=qty-1 ..."); stmt.close();
    conn.commit(); // 全部成功才提交
} catch (SQLException e) {
    conn.rollback(); // 任一失敗全回滾
    throw e;
} finally {
    conn.setAutoCommit(true); // 恢復默認
}

核心原則:同一事務內每條 SQL 用完 Statement 即關閉,避免游標泄漏;異常時必須回滾;連接池環境下 close() 實際是歸還連接,不影響事務邊界(由連接池管理)。

最佳實踐清單

  • 生產環境必須用連接池(HikariCP、Druid),配置合理的最大/最小連接數、超時、驗證查詢。
  • 所有動態 SQL 統一用 PreparedStatement,杜絕拼接防注入。
  • 大數據量查詢設置 setFetchSize() 減少內存壓力。
  • 長事務拆分為短事務,避免鎖競爭、連接佔用過久。
  • 異常堆棧保留原始 SQL 參數(脫敏後)便於排查。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved