封裝連接獲取、增刪改查、資源關閉,採用 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();
核心三步: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 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(); // 刪除
限制:查詢需包含主鍵、單表、無聚合函數;驅動支持程度不一。
PreparedStatement,杜絕 SQL 注入try-with-resources (JDK 7+) 自動關閉