查询数据库后是返回ResultSet还是返回Collection?

原创 2002年09月25日 09:43:00
既然我们把数据库访问封装起来了,那么如果查询数据库返回的是一系列结果,比如我们从数据库中得到所有人的用户名,然后在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再返回,显然这很耗费内存。

使用Iterator返回:
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");
}
}
}

这里返回的是一个内部类,其实你可以象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没区别,还是浪费内存。

数据库结果集ResultSet详解

这篇文章并没有给出如何使用ResultSet的具体例子,只是从ResultSet的功能性上进行了详细的讲述。希望这篇文章对大家理解ResultSet能够有所帮助。下面就是这篇文章的具体内容。  ...
  • u013046841
  • u013046841
  • 2014年08月19日 22:56
  • 3271

基于JDBC 的数据库返回数据Resultset 数据绑定到Javabean

由于jdbc连接所有hibernate等都不能用,也不想用暴力的get/set 方法逐项添加保存为临时Javabean,所以可以采用反射和注解,一下为反射机制 package com.util; ...
  • VIPshao
  • VIPshao
  • 2016年10月18日 14:24
  • 683

JDBC返回结果集转Map集合

package com.tiantian.mybatis.test; import java.math.BigDecimal; import java.sql.Connection; import ...
  • yangzongzhuan
  • yangzongzhuan
  • 2015年05月04日 13:05
  • 4520

初学JDBC(五)-使用ResultSet结果集对数据库表内容实现查询操作

上两篇博客讲了如何对数据库中的表内容进行增删改的操作,这一篇博客来说说如何实现对数据库的表内容进行读取查询操作。...
  • u013132035
  • u013132035
  • 2016年11月19日 10:53
  • 1724

【JAVA】数据库中一些ResultSet的用法实例

JDBC API 2.0/3.0中ResultSet记录集的简便实用的新特性 1 新定义了若干个常数 这些常数用于指定ResultSet 的类型游标移动的方向等性质,如下所示: public st...
  • ming2316780
  • ming2316780
  • 2015年09月18日 12:11
  • 1303

jdbc返回结果集list和ResultSet之认识

1.list和ResultSet的浅认识  结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的...
  • QQ736238785
  • QQ736238785
  • 2017年03月28日 15:17
  • 1581

JSP网页设计-resultset判断数据库查询为空

开始写代码很久了,突然觉得应该记录一下自己学习过程中的点滴,一个是记录自己的成长,另外一个是方便遇到相同问题的人能够快速的解决问题,少走弯路。 最近在忙课程设计,用jsp写一个网站,在进行登录、注册...
  • A6351958
  • A6351958
  • 2016年06月30日 10:34
  • 1302

从servlet中获取的ResultSet结果集如何传递到jsp页面并显示

从servlet中获取的ResultSet结果集如何传递到jsp页面并显示 servlet中连接数据库获得结果集然后遍历结果集每次遍历的结果封装到实体类user中最后把每次得到的user中放入L...
  • bigwangmengdi
  • bigwangmengdi
  • 2017年03月05日 15:13
  • 3607

JAVA连接MYSQL通过查询返回的结果集获取表结构字段类型

static void exec(ResultSet rs, PreparedStatement mstmt) throws SQLException { ResultSetMetaData rs...
  • lu8000
  • lu8000
  • 2013年09月15日 11:12
  • 9113

C# 数据库查询取返回值

数据库课设期末考试结束后,就开始了为期一周的数据库课程设计。幸好这学期学习了C#,所以,对付这个还是有信心的。对于数据库的增删查该,难度并不是很大。数据库连接成功后,之后的便是SQl语句的掌握。小小的...
  • sinat_27714067
  • sinat_27714067
  • 2016年06月30日 17:41
  • 5783
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:查询数据库后是返回ResultSet还是返回Collection?
举报原因:
原因补充:

(最多只允许输入30个字)