java中ResultSet問題

原文地址:http://zpnest.blog.sohu.com/28905212.html

 

     想把數據庫中的幾條記錄顯示出來,結果折騰了半天也沒弄成,總找不到原因,後來乾脆就在讀數據之前用了個rs.next(),在讀取數據,這次沒問題了!

      後來才發現 

      ResultSet 維護指向其當前數據行的光標。每調用一次 next() 方法,光標向下移動一行。最初它位於第一行之前,因此第一次調用 next 將把光標置於第一行上,使它成爲當前行。隨着每次調用 next 導致光標向下移動一行,按照從上至下的次序獲取 ResultSet 行。

 

1.  我們通過JDBC查詢,是否一次是把所有的結果集查詢出來後放到ResultSet中。

2.  在調用ResultSet.next()方法的時候,是否還會和數據庫交互。

 

      其實在以前我一直認爲當statement執行完sql語句後,它會把結果集保存到ResultSet中,然後關閉這個cursor,當實際上並不是這樣的。

 

      今天寫的一個javabean:

 

 

開始把

 

  

 

放入了函數

 

 

中,想到每次調用都會創建一個新的stmt變量,這樣太浪費資源,於是就把

 

 

放入構造函數中,使用的時候直接使用該實例即可。在jsp頁面中使用該javabean。

 

 

 

      該jsp頁面在運行時會拋出ResultSet is colsed異常,注意藍色代碼部分調用了executeQuery();方法,此時javabean中執行的是executeQuery(select * from table1);返回的數據集“rs”也是該語句執行的結果。

      執行到藍色代碼時也調用了executeQuery();此時執行的是調用了executeQuery(select count(*) as mycount from table1);返回的數據集rsTmp就是該語句的執行結果。 

      注意:兩次使用了同一個stmt的executeQuery()方法。

      此後再使用數據集rs時就會拋出ResultSet is colsed異常,因爲此時數據集rs與數據庫中間的聯繫stmt.executeQuery(select * from table1)已經發生了變化。已經變成stmt.executeQuery(select count(*) as mycount from table1).如果採用先前的寫法把Statement stmt=connect.createStatement();放入了函數public ResultSet executeQuery(String sql)中就不會出現這種問題。

      通過上面分析,我們可以的出結論通過JDBC查詢結果集不是直接放到ResultSet中,ResultSet存在的可能是結果集的指針。我們在使用ResultSet時仍然需要和數據庫交互。

 

發佈了13 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章