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

Java ResultSet 操作詳解:游標移動、記錄計數與常見陷阱

     編輯:Java 相關知識

ResultSet 游標基本機制

ResultSet 維護一個指向當前資料列的游標,初始位置在第一列之前。next() 將游標下移一列並返回是否有效,false 表示已無資料。

五大核心操作場景

1. 計算查詢結果總筆數

int count = 0;
while (rs.next()) {
    count++;
}
System.out.println("總筆數:" + count);

分頁應用:若單頁固定 50 筆,讀取 50 筆後若 count == 50 表示可能還有下一頁。

2. 判斷結果集是否為空

if (rs.next()) {
    System.out.println("have data");
} else {
    System.out.println("no data");
}

相當於檢查是否至少有一筆記錄。注意:next() 已將游標移至第一列。

3. 避免「少讀一筆」的經典陷阱

錯誤寫法:


if (rs.next()) {          // 游標移至第 1 列
    while (rs.next()) {   // 從第 2 列開始迴圈
        count++;
    }
}

結果:總筆數少 1,第一列資料遺失。

正確寫法一:重置游標


if (rs.next()) {
    rs.beforeFirst();     // 移回第一列之前
    while (rs.next()) {
        count++;
    }
}

正確寫法二:直接迴圈(推薦)


while (rs.next()) {
    count++;
}

4. 正確讀取所有資料

錯誤:


if (rs.next()) {
    while (rs.next()) {
        System.out.println(rs.getString(1)); // 少讀第一列
    }
}

正確:


if (rs.next()) {
    rs.beforeFirst();
    while (rs.next()) {
        System.out.println(rs.getString(1));
    }
}

或直接:


while (rs.next()) {
    System.out.println(rs.getString(1));
}

5. 僅讀取第一筆記錄


if (rs.next()) {
    System.out.println(rs.getString(1)); // 讀取第 1 列
}

ResultSet 遊標控制方法總覽

建立可捲動 ResultSet


Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,  // 或 TYPE_SCROLL_SENSITIVE
    ResultSet.CONCUR_READ_ONLY          // 或 CONCUR_UPDATABLE
);
ResultSet rs = stmt.executeQuery("SELECT * FROM users");

最佳實踐清單

  1. 預設使用 while(rs.next()) 單向遍歷,除非需要反向/隨機存取
  2. 避免多次 next() 未重置游標,寧可多呼叫 beforeFirst()
  3. 資源關閉順序:ResultSet → Statement → Connection(或使用 try-with-resources)
  4. 大量資料考慮分頁查詢(LIMIT/OFFSET 或游標分頁),避免記憶體溢位
  5. 列索引從 1 開始,非 0,切記 getString(1) 非 getString(0)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法說明支援條件
next()移至下一列所有型別
previous()移至上一列TYPE_SCROLL_INSENSITIVE/Sensitive
first() / last()移至首/末列可捲動型別
beforeFirst() / afterLast()移至首列前/末列後可捲動型別
absolute(int row)移至指定絕對行號可捲動型別
relative(int rows)相對當前位置移動可捲動型別