ResultSet 封裝 SQL 查詢結果,不僅是數據容器,更提供游標導航、數據更新、事務保持等豐富功能。本文系統梳理 JDBC 2.0/3.0 規範下的 ResultSet 分類、創建參數、核心方法與實戰模式。
| 類型 | 創建參數 | 游標移動 | 可更新 | 提交後保持 | 適用場景 |
|---|---|---|---|---|---|
| TYPE_FORWARD_ONLY | 無參 createStatement() | 僅 next() 向前 | 否 | 否(默認關閉) | 單次順序讀取、大數據流 |
| TYPE_SCROLL_INSENSITIVE | createStatement(TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY) | 任意向前/向後/定位 | 否 | 視 HOLD 參數 | 需隨機訪問、不關心並發修改 |
| TYPE_SCROLL_SENSITIVE | createStatement(TYPE_SCROLL_SENSITIVE, CONCUR_READ_ONLY) | 任意移動 | 否 | 視 HOLD 參數 | 需實時看到他事務提交的修改 |
| CONCUR_UPDATABLE | createStatement(TYPE_SCROLL_INSENSITIVE, CONCUR_UPDATABLE) | 任意移動 | 是 | 視 HOLD 參數 | 需通過 ResultSet 修改數據庫 |
JDBC 3.0 新增:第三參數 HOLD_CURSORS_OVER_COMMIT / CLOSE_CURSORS_AT_COMMIT 控制提交後游標是否保持打開。
// 僅可滾動,只讀
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// 可滾動 + 可更新
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// JDBC 3.0 完整參數
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
SQL 必須滿足:
GROUP BY、HAVING、聚合函數。| 方法 | 說明 |
|---|---|
next() / previous() | 移動到下一行/上一行 |
first() / last() | 移動到首行/尾行 |
absolute(int row) | 移動到指定絕對行號(1-based) |
relative(int rows) | 相對當前行移動(正向前、負向後) |
beforeFirst() / afterLast() | 移動到首行前/尾行後(無效行位置) |
isFirst() / isLast() / isBeforeFirst() / isAfterLast() | 判斷游標位置 |
rs.absolute(5); // 定位到第 5 行
rs.updateString("name", "New Name"); // 修改列
rs.updateInt("age", 25);
rs.updateRow(); // 提交到數據庫,**游標不得離開當前行**
rs.moveToInsertRow(); // 移動到插入緩衝區
rs.updateString("name", "Inserted");
rs.updateInt("age", 30);
rs.insertRow(); // 寫入數據庫
rs.moveToCurrentRow(); // 返回原游標位置
rs.absolute(3); rs.deleteRow(); // 立即刪除,游標移動到下一行
rs.updateString("name", "Wrong");
rs.cancelRowUpdates(); // 撤銷對當前行的所有 update,需在 updateRow() 前調用
rs.rowUpdated(); // 當前行是否被更新 rs.rowInserted(); // 當前行是否為新插入 rs.rowDeleted(); // 當前行是否被刪除(留有空位)
getInt(1)、getString("name")。getString() 通用於所有類型,返回字符串表示。getAsciiStream()、getBinaryStream()、getCharacterStream()。getArray() 返回 java.sql.Array。| 常數 | 含義 |
|---|---|
FETCH_FORWARD | 順序處理(首→尾) |
FETCH_REVERSE | 逆序處理(尾→首) |
FETCH_UNKNOWN | 由驅動/數據庫決定 |
CONCUR_READ_ONLY | 只讀協作模式 |
CONCUR_UPDATABLE | 可更新協作模式 |
HOLD_CURSORS_OVER_COMMIT | 提交後保持游標打開 |
CLOSE_CURSORS_AT_COMMIT | 提交時關閉游標(默認) |
ResultSet、Statement、Connection 反序關閉,或用 try-with-resources(JDBC 4.1+)。TYPE_SCROLL_SENSITIVE 實際表現為 INSENSITIVE;大結果集需設置 stmt.setFetchSize(Integer.MIN_VALUE) 啟用流式讀取避免 OOM。