如何獲取ResultSet的行數和列數

當咱們執行數據庫查詢返回一個ResultSet的時候,不少狀況下咱們須要知道這個ResultSet的大小,即它的行數和列數。咱們知道它的列數能夠經過resultSet.getMetaData().getColumnCount()很容易地獲得,然而,java API沒有提供直接訪問ResultSet行數的接口。 java

這個時候,有三個辦法能夠解決: sql

1.改用select count語句,而後直接從ResultSet裏面獲取結果: 數據庫

複製代碼
try {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("select count(*) as rowCount from tableName");
            resultSet.next(); int rowCount = resultSet.getInt("rowCount");
        } catch (Exception e) { // TODO: handle exception  e.printStackTrace();
        }
複製代碼

可是,咱們執行數據庫查詢不光要知道結果的行數,每每接下來還要用到查詢結果。若是用此方法,還須要再執行一次select語句,才能獲得想要的結果集,這樣,就多了一次數據庫查詢,大大下降了執行速度。 spa

2.遍歷Resultset,用一個變量記錄行數。代碼以下: .net

複製代碼
int count = 0; try { while(resultSet.next()){
                count = count + 1;
            }
        } catch (SQLException e1) { // TODO Auto-generated catch block  e1.printStackTrace();
        }
複製代碼

這樣獲取的count值就是結果集的行數。然而,這種方法同第一種方法的問題同樣,不能再使用結果集了。由於這時候指針已經移動到結果集的外面了,再也不指向任何記錄。 指針

3.知道了第二種方法中問題的緣由,咱們就知道如何更好地解決這個問題了。第二種方法的問題在於返回的結果集中的指針不能自由移動,幸虧java爲咱們提供了選擇,可讓咱們建立指針能夠自由移動的結果集,所須要作的只有一件事,就是在建立Statement的時候,加上兩個參數: code

複製代碼
try { //Statement statement = connection.createStatement();  Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            ResultSet resultSet = statement.executeQuery("select * from " + tableName);
        } catch (Exception e) { // TODO: handle exception  e.printStackTrace();
        }
複製代碼

這樣得到的結果集,指針就能夠在其中自由移動。而後,就能夠用以下方法獲取結果集的行數: blog

複製代碼
int rowCount = 0; try {
            resultSet.last();
            rowCount = resultSet.getRow();
        } catch (Exception e) { // TODO: handle exception  e.printStackTrace();
        }
複製代碼

其中resultSet.last()就是將指針移動到結果集的最後一條記錄;而後用resultSet.getRow()獲取指針當前所在的行號(從1開始) 接口

若是接下來你還要使用結果集,別忘了將指針移到第一行: get

resultSet.first();

既然結果集是可滾動的,固然能夠用absolute()方法訪問指定行號的記錄:

boolean java.sql.ResultSet.absolute(int row) throws SQLException

其中row參數可正可負,具體含義查一下ResultSet的absolute()方法就知道了。

相關文章
相關標籤/搜索