原文地址: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時仍然需要和數據庫交互。