結果集 (ResultSet)全面解析

、ZJL發表於2020-11-18
結果集 (ResultSet) 是資料中查詢結果返回的一種物件,可以說	結果集是一個儲存查詢結果的物件,但是結果集並不僅僅具有存	儲的功能,他同時還具有操縱資料的功能,可能完成對資料的更新等。

結果集讀取資料的方法主要是 getXXX () ,他的引數可以使整型表示第幾列(是從 1 開始的),還可以是列名。返回的是對應的 XXX 型別的值。如果對應那列時空值,XXX 是物件的話返回 XXX 型的空值,如果 XXX 是數字型別,如 Float 等則返回 0,boolean 返回 false。使用 getString () 可以返回所有的列的值,不過返回的都是字串型別的。XXX 可以代表的型別有:基本的資料型別如整型 (int),布林型 (Boolean),浮點型 (Float,Double) 等,位元型(byte),還包括一些特殊的型別,如:日期型別(java.sql.Date),時間型別 (java.sql.Time),時間戳型別 (java.sql.Timestamp),大數型 (BigDecimal 和 BigInteger 等) 等。還可以使用 getArray (int colindex/String columnname),通過這個方法獲得當前行中,colindex 所在列的元素組成的物件的陣列。使用 getAsciiStream (
int colindex/String colname) 可以獲得該列對應的當前行的 ascii 流。也就是說所有的 getXXX 方法都是對當前行進行操作。

結果集從其使用的特點上可以分為四類,這四類的結果集的所具備的特點都是和 Statement 語句的建立有關,因為結果集是通過 Statement 語句執行後產生的,所以可以說,結果集具備何種特點,完全決定於 Statement,當然我是說下面要將的四個特點,在 Statement 建立時包括三種型別。首先是無引數型別的,他對應的就是下面要介紹的基本的 ResultSet 對應的 Statement。下面的程式碼中用到的 Connection 並沒有對其初始化,變數 conn 代表的就是 Connection 對應的物件。SqlStr 代表的是響應的 SQL 語句。

1、 最基本的 ResultSet。

之所以說是最基本的 ResultSet 是因為,這個 ResultSet 他起到的作用就是完成了查詢結果的儲存功能,而且只能讀去一次,不能夠來回的滾動讀取。這種結果集的建立方式如下:

Statement st = conn.CreateStatement 
ResultSet rs = Statement.excuteQuery(sqlStr); 

由於這種結果集不支援,滾動的讀去功能所以,如果獲得這樣一個結果集,只能使用它裡面的 next () 方法,逐個的讀去資料。

2、 可滾動的 ResultSet 型別。

這個型別支援前後滾動取得紀錄 next()、previous (),回到第一行 first (),同時還支援要去的 ResultSet 中的第幾行 absolute(int n),以及移動到相對當前行的第幾行 relative (int n),要實現這樣的 ResultSet 在建立 Statement 時用如下的方法。

Statement st = conn. createStatement (int resultSetType, int resultSetConcurrency)
ResultSet rs = st.executeQuery(sqlStr)

其中兩個引數的意義是:

  • resultSetType 是設定 ResultSet 物件的型別可滾動,或者是不可滾動。取值如下:
  • ResultSet.TYPE_FORWARD_ONLY 只能向前滾動
  • ResultSet.TYPE_SCROLL_INSENSITIVE 和 Result.TYPE_SCROLL_SENSITIVE

這兩個 方法都能夠實現任意的前後滾動,使用各種移動的 ResultSet 指標的方法。二者的區別在於前者對於修改不敏感,而後者對於修改敏感。

resultSetConcurency 是設定 ResultSet 物件能夠修改的,取值如下:

  • ResultSet.CONCUR_READ_ONLY 設定為只讀型別的引數。
  • ResultSet.CONCUR_UPDATABLE 設定為可修改型別的引數。

所以如果只是想要可以滾動的型別的 Result 只要把 Statement 如下賦值就行了。

Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE,ResultSet.CONCUR_READ_ONLY); 

ResultSet rs = st.excuteQuery(sqlStr) ;

用這個 Statement 執行的查詢語句得到的就是可滾動的 ResultSet 。

3、 可更新的 ResultSet

這樣的 ResultSet 物件可以完成對資料庫中表的修改,但是我知道 ResultSet 只是相當於資料庫中表的檢視,所以並不時所有的 ResultSet 只要設定了可更新就能夠完成更新的,能夠完成更新的 ResultSet 的 SQL 語句必須要具備如下的屬性:

  • a 、只引用了單個表。

  • b 、不含有 join 或者 group by 子句。

  • c 、那些列中要包含主關鍵字。
    具有上述條件的,可更新的 ResultSet 可以完成對資料的修改,可更新的結果集的建立方法是:

     Statement st = 		createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE) 
    

4、 可保持的 ResultSet

正常情況下如果使用 Statement 執行完一個查詢,又去執行另一個查詢時這時候第一個查詢的結果集就會被關閉,也就是說,所有的 Statement 的查詢對應的結果集是一個,如果呼叫 Connection 的 commit () 方法也會關閉結果集。可保持性就是指當 ResultSet 的結果被提交時,是被關閉還是不被關閉。JDBC2.0 和 1.0 提供的都是提交後 ResultSet 就會被關閉。不過在 JDBC3.0 中,我們可以設定 ResultSet 是否關閉。要完成這樣的 ResultSet 的物件的建立,要使用的 Statement 的建立要具有三個引數,這個 Statement 的建立方式也就是,我所說的 Statement 的第三種建立方式。

當使用 ResultSet 的時候,當查詢出來的資料集記錄很多,有一千萬條的時候,那 rs 所指的物件是否會佔用很多記憶體,如果記錄過多,那程式會不會把系統的記憶體用光呢

不會的,ResultSet 表面看起來是一個記錄集,其實這個物件中只是記錄了結果集的相關資訊,具體的記錄並沒有存放在物件中,具體的記錄內容知道你通過 next 方法提取的時候,再通過相關的 getXXXXX 方法提取欄位內容的時候才能從資料庫中得到,這些並不會佔用記憶體,具體消耗記憶體是由於你將記錄集中的資料提取出來加入到你自己的集合中的時候才會發生,如果你沒有使用集合記錄所有的記錄就不會發生消耗記憶體厲害的情況。

相關文章