result與resultset的區別

以前用jdbc的時候,只知道有一個resultset是結果集,今天逛論壇的時候,看見有位哥們用這個,然後就搜了一下,大家一起學習學習

ResultSet:

         1,定義

        public interface ResultSet

     表示數據庫結果集的數據表,通常通過執行查詢數據庫的語句生成。

         2,獲得

        Statement stmt = con.createStatement(
                                      ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
       ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");

         3,迭代

     ResultSet 對象具有指向其當前數據行的指針。最初,指針被置於第一行之前。next 方法將指針移動到下一行;因爲該方法在 ResultSet 對象中沒有下一行時返回                 false,所以可以在 while 循環中使用它來迭代結果集。

      while(rs.next())

      {

        

       }

   4,取值

    ResultSet 接口提供用於從當前行檢索列值的獲取方法(getBooleangetLong 等)。可以使用列的索引編號或列的名稱檢索值。一般情況下,使用列索引較爲高效。  列從 1 開始編號。爲了獲得最大的可移植性,應該按從左到右的順序讀取每行中的結果集列,而且每列只能讀取一次。

    rs.getString();

    以上部分摘自JDK1.5的中文版文檔,如果由於版本問題導致了一些問題,請見諒。在此並沒有詳盡的列出所有關於ResultSet的信息,大家可自行翻閱文檔。但是我們在程序中基本上就只使用以上列出的部分了,我猜在大部分情況下,我們在WEB應用中,很少使用ResultSet進行數據更新吧?所以我並沒有列出關於數據更新的相關內容,感興趣的可自行查看。

    下面想象一個問題:我從數據庫查詢某一表的所有數據,估計100行吧,但是肯定不知道具體多少行,我們使用ResultSet來存儲。那麼我想取出最後一行的第一列的某一個字段值,怎麼辦呢?除了迭代還有什麼好辦法嗎?我甚至有可能在一個方法內部多次使用到這樣的需求:我就想隨意的取出任意行的任意列。怎麼辦呢,反覆迭代嗎?有沒有考慮過數據庫連接的問題?

  就我目前的知識層次來說,我對以上問題在現有的ResultSet上,無能爲力,不知道怎麼辦?我翻遍了我的JDK1.5的中文版文檔也沒能找到好的答案,我頓時覺得文檔落伍了。JAVA的使用率較.Net更大,難道就找不到類似Datatable的數據集嗎?我猜是有的,只是我使用的文檔貌似是針對JAVA SE版本,可能沒有涉及到更深入的企業級應用。

  在講解Result之前,先說說目前大家都怎麼來存儲數據集吧。毫無疑問,在SSH框架中,大家都使用實體List,這樣就很方便迭代,也很方便定位,而且在展現的時候藉助Struts標籤,很給力 。但是,我基本上是拒絕使用的,第一,目前SSH配合List使用的 查詢語言HQL一點也不好用,也不快速(個人感覺)。第二,冗餘字段,我只想查詢一個表的兩個字段,沒必要查詢出整個表的幾十個字段吧!第三,表連接的問題,難道有什麼完美的解決方案嗎?難道有比join更好的嗎?甚至有些人在沒有使用ORM框架的情況下,先自行查詢出ResultSet,而後再另行迭代封裝到實體List中,這樣做真的值得嗎?

  Result:

    1,  定義

    表示數據庫結果集的數據表。完整名稱javax.servlet.jsp.jstl.sql.Result

    2,  獲得

    爲了得到Result,我們首先必須先要得到Result,然後使用ResultSupport.toResult(rs)轉化即可。

 

        Statement stmt = con.createStatement(
                                      ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
       ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
 

      Result rst = ResultSupport.toResult(rs);

    3,  迭代

    很不幸鄙人住處不能上網,無法下載閱讀源代碼,資料也比較匱乏,度娘和谷哥還有搜妹在這個問題也都沒能給力,最後就只能一點點的嘗試了。功夫不負有心人,終於被我發現以下用法:

        for (SortedMap item : rst.getRows()) {

                 

    }

    這種迭代方式並沒有比ResultSet的更復雜,而且如果你願意的話,你可以稍作修改使迭代可以從任意行開始,也可以從任意端開始。

    4,  取值

     由於Result中的每一行都是SortedMap所以遵循規則:

     Object  value=item.get(key);( SortedMap的另外一些方法當然也適用)

 

     介紹完兩個數據集,相信大家都有所瞭解了。其實他們的作用相同,用法也類似,大部分情況下,兩者通用幾乎沒有什麼問題。

     現在我嘗試着使用Result解決一下剛剛標紅還不能解決的問題。

      1,  取得最後一行第一列

        Object o= rst.getRowsByIndex()[rst.getRowCount()][0];

      這難道不夠簡單嗎?

      2,  取得任意行任意列

     Object o= rst.getRowsByIndex()[行索引][列索引];

    請注意:一定要做好防範,避免拋出超出索引的異常。其他用法以後慢慢開發吧。另外還需要說明的是,一旦我們從ResultSet獲得Result後,數據庫連接即可釋放,不會存在佔用連接的情況。

    有些人說我就用實體List,讓ResultSet和Result都見鬼去吧。

    我纔不管呢!快速,直接,簡單,拋棄冗餘字段,我做的沒錯吧?

    至於大家怎麼選擇,隨心吧。碼農也是感性的。

 

轉載自:http://www.cnblogs.com/Bytime/archive/2012/08/07/2626537.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章