在使用 JDBC 操作資料庫時,開發人員常會遇到一個問題:ResultSet 介面並未直接提供取得資料筆數的方法。本文將系統性地介紹三種主流解決方案,並分析各自的優缺點與適用場景。
最直觀的做法是先執行一條聚合查詢,再執行實際的業務查詢。
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,生產環境強烈不建議使用。
理解 ResultSet 游標機制與結果集類型是正確獲取行數的關鍵。根據業務規模與效能需求選擇適當方案,才能編寫出健壯、高效的 JDBC 程式碼。