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

JDBC 中獲取 ResultSet 行數的完整指南

     編輯:Java 相關知識

前言

在使用 JDBC 操作資料庫時,開發人員常會遇到一個問題:ResultSet 介面並未直接提供取得資料筆數的方法。本文將系統性地介紹三種主流解決方案,並分析各自的優缺點與適用場景。

方案一:使用 COUNT(*) 查詢(推薦用於大數據量)

最直觀的做法是先執行一條聚合查詢,再執行實際的業務查詢。

Connection con = ...;
Statement stmt = con.createStatement();
String sqlStr = "SELECT COUNT(*) AS total FROM your_table";
ResultSet rst = stmt.executeQuery(sqlStr);
rst.next();
int total = rst.getInt("total");

優點:效能極佳,尤其適合百萬級以上資料表;不需要載入實際資料列。
缺點:需執行兩次查詢,增加資料庫負擔;若資料在兩次查詢間發生變動,計數可能不精確。

方案二:使用可捲動結果集

將游標移至最後一列,再呼叫 getRow() 取得當前行號即為總行數。

Statement stmt = con.createStatement(
    ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE
);
ResultSet rst = stmt.executeQuery("SELECT * FROM accounts");
rst.last();                // 移至最後一列
int total = rst.getRow();  // 取得行號=總行數
rst.beforeFirst();         // 重置游標以便後續遍歷

關鍵點:
1. 必須建立 TYPE_SCROLL_SENSITIVE 或 TYPE_SCROLL_INSENSITIVE 的可捲動結果集。
2. 若先執行 while(rst.next()) 遍歷完畢,游標已在末尾,再呼叫 getRow() 會返回 0,必須先 rst.last()。
3. 適用於中小型結果集;大數據量會造成記憶體壓力。

方案三:遍歷計數(僅適極小結果集)

int count = 0;
while (rst.next()) { count++; }
rst.beforeFirst(); // 若仍需重用結果集

缺點:效能最差,會逐列讀取所有資料,極易導致 OOM,生產環境強烈不建議使用。

最佳實踐建議

  • 大數據量、高併發場景 → 方案一(COUNT(*))
  • 中小型結果集且需隨機存取 → 方案二(可捲動結果集)
  • 避免在業務邏輯中手動遍歷計數

總結

理解 ResultSet 游標機制與結果集類型是正確獲取行數的關鍵。根據業務規模與效能需求選擇適當方案,才能編寫出健壯、高效的 JDBC 程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved