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

Java JDBC 核心操作全攻略:連接、事務、存儲過程、可滾動/可更新結果集

     編輯:Java 相關知識

一、基礎封裝:SQLBean 通用操作類

封裝連接獲取、增刪改查、資源關閉,採用 PreparedStatement 防注入:

public class SQLBean {
    private Connection conn;
    private PreparedStatement ps;
    private ResultSet rs;
    // 配置信息...
    public SQLBean() { /* 加載驅動、建立連接 */ }
    
    public boolean update(String sql, String[] params) { /* 參數綁定、executeUpdate */ }
    public ResultSet query(String sql, String[] params) { /* 參數綁定、executeQuery */ }
    public void close() { /* 逆序關閉 rs、ps、conn */ }
}

調用示例:

SQLBean sql = new SQLBean();
ResultSet rs = sql.query("select ename from emp", new String[]{});
while (rs.next()) System.out.println(rs.getString(1));
sql.close();

二、事務管理:ACID 手動控制

核心三步:setAutoCommit(false) → 批量操作 → commit()/rollback()

Connection conn = DriverManager.getConnection(url, user, pwd);
conn.setAutoCommit(false);           // 1. 關閉自動提交
Statement stmt = conn.createStatement();
stmt.addBatch("sql1"); stmt.addBatch("sql2"); // 2. 批量加入
stmt.executeBatch();                 // 3. 執行批次
conn.commit();                       // 4. 提交事務
conn.setAutoCommit(true);            // 5. 恢復自動提交
// 異常捕獲中調用 conn.rollback() 回滾

注意:finally 中確保資源釋放,避免連接洩露。

三、調用存儲過程:CallableStatement

CallableStatement call = conn.prepareCall("{call sp_pro4(?,?,?,?,?,?)}");
// 輸入參數
call.setString(1, "emp"); call.setInt(2, 4); call.setInt(3, 1);
// 註冊輸出參數
call.registerOutParameter(4, OracleTypes.NUMBER); // 總記錄數
call.registerOutParameter(5, OracleTypes.NUMBER); // 總頁數
call.registerOutParameter(6, OracleTypes.CURSOR); // 結果集游標
call.execute();
// 獲取輸出
int total = call.getInt(4);
ResultSet rs = (ResultSet) call.getObject(6);
while (rs.next()) { /* 遍歷數據 */ }

四、可滾動結果集

創建時指定類型與並發性:

Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE, // 可滾動,不敏感於底層變化
    ResultSet.CONCUR_READ_ONLY         // 只讀
);
ResultSet rs = stmt.executeQuery("select * from emp order by sal");
rs.last(); rs.getRow(); rs.absolute(6); rs.previous(); // 靈活定位

前提:JDBC 驅動必須支持(Oracle 支持良好)。

五、可更新結果集

直接在結果集上增刪改,自動同步數據庫:

Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_UPDATABLE       // 關鍵:可更新
);
ResultSet rs = stmt.executeQuery("select * from emp2");
rs.next(); rs.updateString("ename", "AAAA"); rs.updateRow(); // 更新
rs.moveToInsertRow(); rs.updateInt(1, 9999); rs.insertRow(); // 插入
rs.absolute(5); rs.deleteRow(); // 刪除

限制:查詢需包含主鍵、單表、無聚合函數;驅動支持程度不一。

最佳實踐總結

  • **連接池**:生產環境必須使用 (HikariCP/Druid),避免頻繁創建銷毀
  • **參數化查詢**:堅持 PreparedStatement,杜絕 SQL 注入
  • **資源管理**:try-with-resources (JDK 7+) 自動關閉
  • **事務邊界**:業務邏輯層控制,DAO 層不自行提交
  • **結果集選型**:默認只讀前向;需隨機訪問用滾動;需就地修改用可更新
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved