ResultSet 預設為單向、唯讀、順序讀取的游標模型。常見錯誤包括:欄位讀取順序不符 SELECT 列順序、重複讀取同一欄位、或試圖倒序讀取。
// SQL: SELECT name, id FROM sort
while (rs.next()) {
System.out.println(rs.getInt(2)); // 讀 id
System.out.println(rs.getInt(2)); // 再次讀 id → 拋出 SQLException: No data found
}
原因:JDBC 驅動為了效率,getXxx() 可能會消費底層緩衝區,第二次呼叫時資料已不可用。
getString(1) (name),再 getInt(2) (id)。while (rs.next()) {
String name = rs.getString(1);
int id = rs.getInt(2);
// 後續邏輯使用 name、id 變數
}
Statement 時指定 ResultSet.TYPE_SCROLL_INSENSITIVE,但效能較差,慎用。ResultSet 內部維護一個指向當前行的指標,next() 移動指標並預取該行資料流。getXxx(n) 從資料流按順序解碼第 n 個欄位;若跳過或重複讀取,驅動無法回溯資料流,故拋出異常。
try-with-resources 自動關閉 ResultSet、Statement、Connection。