查詢資料庫後是返回ResultSet還是返回Collection? (轉)
查詢資料庫後是返回ResultSet還是返回Collection? (轉)[@more@]既然我們把訪問封裝起來了,那麼如果查詢資料庫返回的是一系列結果,比如我們從資料庫中得到所有人的名,然後在頁面顯示出來。
這裡就有一個普遍疑問,我這個bean是返回ResultSet到Jsp中還是Collection?
我曾經有段時間圖省事,直接返回ResultSet,然後在我的jsp頁面中是大量的ResultSet遍歷。這其實還是將資料層和顯示層混淆在一起。在 CMP中,返回的是Collection,這樣偶合性降低,不用在修改資料庫結構後,一直修改到前臺Jsp頁面,這和以前的 開發方式沒兩樣。
但是返回Collection不是很高,因為意味著在中要開闢一個記憶體存放所有的結果。
我看了這篇文章後,覺得啟發很大,返回Iterator就可以了。
Iterator也是個,在Jive中大量使用了Iterator,我以前很奇怪,為什麼他沒事自己寫個Iterator,現在知道原因了,這樣節省記憶體,而且效率高。
看下面比較:
public List getUsers() {
ResultSet rs = userQuery();
List retval = new ArrayList();
while (rs.next()) {
retval.add(rs.getString(1));
}
return retval;
}
上面是個我們採取返回Collection後最常用的方法,將ResultSet中的使用者名稱加入List再返回,顯然這很耗費記憶體。
使用Iterator返回:
public Iterator getUsers() {
final ResultSet rs = userDbQuery();
return new Iterator() {
private next;
public void hasNext() {
if (next == null) {
if (! rs.next()) {
return false;
}
next = rs.getString(1);
}
return true;
}
public Object next() {
if (! hasNext()) {
throw new NoSuchElementException();
}
String retval = next;
next = null;
return retval;
}
public void remove() {
throw new UnsupportedOperationException("no remove allowed");
}
}
}
這裡返回的是一個內部類,其實你可以象Jive那樣,專門做個Iterator類,這樣,這裡寫得就不那麼難看,你自己定義的Iterator和Collection中的Iterator沒有任何關係,自己定義了三個方法 hasNext(); next(); remove();這樣看上去和Collection的Iterator是一樣的。
從自己作的這個Iterator類中看到,這個Javabean只是做了一個指標傳遞作用,將本Javabean的指標傳遞到ResultSet,這樣既提高了效率,節約了記憶體,又降低了偶合性,這是堪稱典型的示範。
既然返回iterator這麼好,有人經常用到一個簡單的返回Iterator方法:
public Iterator getUsers() {
ResultSet rs = userDbQuery();
List list = new ArrayList()
while (rs.next()) {
list.add(rs.getString(1));
}
return list.iterator();
}
這其實和直接返回list沒區別,還是浪費記憶體。
這裡就有一個普遍疑問,我這個bean是返回ResultSet到Jsp中還是Collection?
我曾經有段時間圖省事,直接返回ResultSet,然後在我的jsp頁面中是大量的ResultSet遍歷。這其實還是將資料層和顯示層混淆在一起。在 CMP中,返回的是Collection,這樣偶合性降低,不用在修改資料庫結構後,一直修改到前臺Jsp頁面,這和以前的 開發方式沒兩樣。
但是返回Collection不是很高,因為意味著在中要開闢一個記憶體存放所有的結果。
我看了這篇文章後,覺得啟發很大,返回Iterator就可以了。
Iterator也是個,在Jive中大量使用了Iterator,我以前很奇怪,為什麼他沒事自己寫個Iterator,現在知道原因了,這樣節省記憶體,而且效率高。
看下面比較:
public List getUsers() {
ResultSet rs = userQuery();
List retval = new ArrayList();
while (rs.next()) {
retval.add(rs.getString(1));
}
return retval;
}
上面是個我們採取返回Collection後最常用的方法,將ResultSet中的使用者名稱加入List再返回,顯然這很耗費記憶體。
使用Iterator返回:
public Iterator getUsers() {
final ResultSet rs = userDbQuery();
return new Iterator() {
private next;
public void hasNext() {
if (next == null) {
if (! rs.next()) {
return false;
}
next = rs.getString(1);
}
return true;
}
public Object next() {
if (! hasNext()) {
throw new NoSuchElementException();
}
String retval = next;
next = null;
return retval;
}
public void remove() {
throw new UnsupportedOperationException("no remove allowed");
}
}
}
這裡返回的是一個內部類,其實你可以象Jive那樣,專門做個Iterator類,這樣,這裡寫得就不那麼難看,你自己定義的Iterator和Collection中的Iterator沒有任何關係,自己定義了三個方法 hasNext(); next(); remove();這樣看上去和Collection的Iterator是一樣的。
從自己作的這個Iterator類中看到,這個Javabean只是做了一個指標傳遞作用,將本Javabean的指標傳遞到ResultSet,這樣既提高了效率,節約了記憶體,又降低了偶合性,這是堪稱典型的示範。
既然返回iterator這麼好,有人經常用到一個簡單的返回Iterator方法:
public Iterator getUsers() {
ResultSet rs = userDbQuery();
List list = new ArrayList()
while (rs.next()) {
list.add(rs.getString(1));
}
return list.iterator();
}
這其實和直接返回list沒區別,還是浪費記憶體。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992009/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於:查詢資料庫後是返回ResultSet還是返回Collection資料庫
- 致板橋:關於"查詢資料庫後是返回ResultSet還是返回Collection?"的幾點問題資料庫
- 查詢資料庫後是返回ResultSet實現中遇到的問題資料庫
- JAVA資料庫處理(連線,資料查詢,結果集返回)Java資料庫
- 返回部分結果後,才報單行子查詢返回多行。
- Hibernate查詢後返回的集合物件中每個物件是什麼型別的?物件型別
- 【轉載】關聯式資料庫還是NoSQL資料庫資料庫SQL
- 資料庫是平替還是改造?資料庫
- Elasticsearch如何做到億級資料查詢毫秒級返回?Elasticsearch
- 重新開貼!探討web應用中ResultSet返回的資料表示Web
- mybatis配置:map查詢空值返回MyBatis
- Entity Framework: 檢視查詢時重複返回第一行值, duplicate frst rows in resultset from a viewFrameworkView
- 執行Sybase儲存過程並返回ResultSet儲存過程
- WebView#shouldOverrideUrlLoading究竟要返回true還是falseWebViewIDEFalse
- 在HQL select查詢語句中自定義查詢結果返回的資料型別資料型別
- 關於EJB查詢返回值的解決方法 (轉)
- ajax返回json格式資料總是有問題,原因是bom頭資訊JSON
- 模型聯合查詢返回指定欄位模型
- 如何自行查詢出 SAP ABAP 標準的 OData 服務返回資料的後臺資料庫表和表欄位名稱資料庫
- 是先做資料庫設計還是先建模資料庫
- SQL -- 使用聯結還是子查詢?SQL
- 每天用SpringBoot,還不懂RESTful API返回統一資料格式是怎麼實現的?Spring BootRESTAPI
- Java MyBatis 插入資料庫返回主鍵JavaMyBatis資料庫
- 使用 express 模擬後臺介面返回資料Express
- MongoDB(13)- 查詢操作返回指定的欄位MongoDB
- PostgreSQL函式:返回表查詢結果集SQL函式
- oracle中基於ROWNUM的查詢的返回Oracle
- 引數和返回值裡面到底用指標還是value指標
- 複雜查詢還是直接寫sql吧SQL
- 硬核解讀,WeTune是如何提升資料庫查詢重寫效能?資料庫
- 資料是黃金還是垃圾?
- Laravel 查詢資料庫欄位內容是 Json 陣列時的查詢語句Laravel資料庫JSON陣列
- js前臺如何使用後臺返回的資料JS
- 資料庫,邏輯刪還是物理刪?資料庫
- 究竟先操作快取,還是資料庫?快取資料庫
- 資料庫查詢資料庫
- 返回物件(轉)物件
- 資料庫 - 資料查詢資料庫