結果集 (ResultSet)全面解析
結果集 (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 方法提取欄位內容的時候才能從資料庫中得到,這些並不會佔用記憶體,具體消耗記憶體是由於你將記錄集中的資料提取出來加入到你自己的集合中的時候才會發生,如果你沒有使用集合記錄所有的記錄就不會發生消耗記憶體厲害的情況。
相關文章
- iOS FMDB有返回結果集和無返回結果集iOS
- 批次對比結果集
- PHP PDO獲取結果集PHP
- 結果集集合操作(待更新)
- Mybatis 查詢語句結果集總結MyBatis
- MySQL in UnionAll結果集的優化MySql優化
- 巧用臨時表將大結果集轉換為小結果集驅動查詢薦
- ResultSet的方法和結構分析
- Mybatis使用小技巧-自定義結果集MyBatis
- Docker--docker ps 命令與結果解析Docker
- 解析Oracle執行計劃的結果Oracle
- this 全面解析
- this全面解析
- MySQL EXPLAIN結果集分析 - 附帶大量案例MySqlAI
- PostgreSQL函式:返回表查詢結果集SQL函式
- oracle result cache 結果集快取的使用Oracle快取
- Oracle中過程/函式返回結果集Oracle函式
- Oracle 儲存過程返回結果集|轉|Oracle儲存過程
- JDBC泛型類反射封裝結果集JDBC泛型反射封裝
- Oracle 儲存過程返回結果集 (轉)Oracle儲存過程
- DBeaver 匯出多個查詢結果集
- Laravel 手動建立分頁返回物件結果集Laravel物件
- RowSet離線結果集物件的使用詳解物件
- Mybatis 強大的結果集對映器resultMapMyBatis
- MySQL中如何橫向顯示結果集薦MySql
- 11g新特性之結果集快取快取
- Redis資料結構:List型別全面解析Redis資料結構型別
- MySQL執行計劃explain輸出列結果解析MySqlAI
- this全面解析(二)
- this 全面解析(一)
- JavaScriptCore全面解析JavaScript
- VLayout全面解析
- 【Python】轉換mysql 結果集為詞典型別PythonMySql型別
- Oracle11新特性——SQL快取結果集(五)OracleSQL快取
- 使用ROWNUM將導致查詢結果集的固化
- Oracle11新特性——SQL快取結果集(三)OracleSQL快取
- JAVA + Oracle儲存過程返回查詢結果集JavaOracle儲存過程
- iOS動畫全面解析iOS動畫