查询数据库后是返回ResultSet还是返回Collection?
既然我们把数据库访问封装起来了,那么如果查询数据库返回的是一系列结果,比如我们从数据库中得到所有人的用户名,然后在Jsp页面显示出来。
这里就有一个普遍疑问,我这个javabean是返回ResultSet到Jsp中还是Collection?
我曾经有段时间图省事,直接返回ResultSet,然后在我的jsp页面中是大量的ResultSet遍历。这其实还是将数据层和显示层混淆在一起。在EJB CMP中,返回的是Collection,这样偶合性降低,不用在修改数据库结构后,一直修改程序到前台Jsp页面,这和以前的php Asp开发方式没两样。
但是返回Collection效率不是很高,因为意味着在内存中要开辟一个内存存放所有的结果。
我看了http://builder.com.com/article.jhtml?id=u00220020814R4B01.htm这篇文章后,觉得启发很大,返回Iterator就可以了。
Iterator也是个模式,在Jive中大量使用了Iterator,我以前很奇怪,为什么他没事自己写个Iterator,现在知道原因了,这样节省内存,而且效率高。
看下面比较:
public List getUsers() { ResultSet rs = userDbQuery();List retval = new ArrayList();while (rs.next()) {retval.add(rs.getString(1));}return retval;}上面是个我们采取返回Collection后最常用的方法,将ResultSet中的用户名加入List再返回,显然这很耗费内存。public Iterator getUsers() {final ResultSet rs = userDbQuery();return new Iterator() {private Object 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");}}}public Iterator getUsers() {ResultSet rs = userDbQuery();List list = new ArrayList()while (rs.next()) {list.add(rs.getString(1));}return list.iterator();}