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

JDBC ResultSet 讀取陷阱:順序、單向與重複讀取

     編輯:Java 相關知識

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() 可能會消費底層緩衝區,第二次呼叫時資料已不可用。

正確姿勢

  1. 嚴格遵循 SELECT 列順序:先 getString(1) (name),再 getInt(2) (id)。
  2. 單次讀取存入變數:
    while (rs.next()) {
        String name = rs.getString(1);
        int id = rs.getInt(2);
        // 後續邏輯使用 name、id 變數
    }
    
  3. 若需隨機存取:建立 Statement 時指定 ResultSet.TYPE_SCROLL_INSENSITIVE,但效能較差,慎用。

底層原理

ResultSet 內部維護一個指向當前行的指標,next() 移動指標並預取該行資料流。getXxx(n) 從資料流按順序解碼第 n 個欄位;若跳過或重複讀取,驅動無法回溯資料流,故拋出異常。

最佳實踐

  • 使用 try-with-resources 自動關閉 ResultSet、Statement、Connection。
  • 改用 ORM 框架(MyBatis、JPA)將結果映射為實體物件,避免手寫 JDBC 細節。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved