如何擷取ResultSet的行數和列數

來源:互聯網
上載者:User

當我們執行資料庫查詢返回一個ResultSet的時候,很多情況下我們需要知道這個ResultSet的大小,即它的行數和列數。我們知道它的列數可以通過resultSet.getMetaData().getColumnCount()很容易地得到,然而,java API沒有提供直接存取ResultSet行數的介面。

這個時候,有三個辦法可以解決:

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語句,才能得到想要的結果集,這樣,就多了一次資料庫查詢,大大降低了執行速度。

2.遍曆Resultset,用一個變數記錄行數。代碼如下:

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

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

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

        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();        }

這樣獲得的結果集,指標就可以在其中自由移動。然後,就可以用如下方法擷取結果集的行數:

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

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

如果接下來你還要使用結果集,別忘了將指標移到第一行:

resultSet.first();

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.