zz 如何獲取ResultSet的行數和列數

轉載自:http://tech.ddvip.com/2011-12/1324866049170388.html

當我們執行數據庫查詢返回一個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()方法就知道了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章