查詢資料庫後是返回ResultSet還是返回Collection? (轉)

worldblog發表於2007-12-12
查詢資料庫後是返回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沒區別,還是浪費記憶體。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992009/,如需轉載,請註明出處,否則將追究法律責任。

相關文章