ResultSet 維護一個指向當前資料列的游標,初始位置在第一列之前。next() 將游標下移一列並返回是否有效,false 表示已無資料。
int count = 0;
while (rs.next()) {
count++;
}
System.out.println("總筆數:" + count);
分頁應用:若單頁固定 50 筆,讀取 50 筆後若 count == 50 表示可能還有下一頁。
if (rs.next()) {
System.out.println("have data");
} else {
System.out.println("no data");
}
相當於檢查是否至少有一筆記錄。注意:next() 已將游標移至第一列。
錯誤寫法:
if (rs.next()) { // 游標移至第 1 列
while (rs.next()) { // 從第 2 列開始迴圈
count++;
}
}
結果:總筆數少 1,第一列資料遺失。
正確寫法一:重置游標
if (rs.next()) {
rs.beforeFirst(); // 移回第一列之前
while (rs.next()) {
count++;
}
}
正確寫法二:直接迴圈(推薦)
while (rs.next()) {
count++;
}
錯誤:
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));
}
if (rs.next()) {
System.out.println(rs.getString(1)); // 讀取第 1 列
}
| 方法 | 說明 | 支援條件 |
|---|---|---|
| next() | 移至下一列 | 所有型別 |
| previous() | 移至上一列 | TYPE_SCROLL_INSENSITIVE/Sensitive |
| first() / last() | 移至首/末列 | 可捲動型別 |
| beforeFirst() / afterLast() | 移至首列前/末列後 | 可捲動型別 |
| absolute(int row) | 移至指定絕對行號 | 可捲動型別 |
| relative(int rows) | 相對當前位置移動 | 可捲動型別 |