`

查询数据库后是返回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再返回,显然这很耗费内存。

使用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没区别,还是浪费内存。
分享到:
评论
2 楼 kgd1120 2011-04-11  
如果要简化应用,可以直接使用JSTL包中的Result类,并且提供了工具类把ResultSet转换为Result,Result与JDBC接口无依赖,并且可以直接使用JSTL标签库遍历!
1 楼 Jathon_hs 2011-04-11  
这样做好像没有close ResultSet, Statement, Connection. 应该会有问题吧。

相关推荐

    几种数据库的连接方法源码+文档

    在完成数据库操作后,记得将连接返回到池中,而不是关闭它:`ds.close()`。 文档通常会涵盖这些连接方法的详细步骤、配置参数、异常处理等信息。例如,`002ConnectDataBase`可能包含具体的示例代码、配置文件以及...

    Java调用带参数的存储过程并返回集合

    在Java开发中,有时我们需要与数据库进行深度交互,这时候存储过程就显得尤为重要。特别是当涉及到复杂的业务逻辑或者数据处理时,Oracle数据库中的存储过程能够提供更高效和安全的解决方案。本话题将详细讲解如何...

    springmybatis

    查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...

    JDBC(oracle)java测试题.pdf

    13. JDBC方法行为:`Statement`的`executeQuery()`返回一个`ResultSet`对象,用于存储查询结果。`executeUpdate()`返回的是受影响的行数,而非布尔值。`ResultSet`的`getString()`方法可以获取`CHAR`类型的值。描述...

    JDBC(oracle)java测试题.docx

    选项A和B正确,CREATE是DDL(数据定义语言),用于创建数据库对象,SELECT是查询语言,不属于DML。 4. **设置SQL*Plus页面大小**:在SQL*Plus中,设置每页显示行数的命令是`set pagesize 20`或`set pages 20`,选项...

    tp5.1 框架数据库-数据集操作实例分析

    `即可执行数据库的查询操作并返回数据集对象。在这个基础上,可以使用类似数组的方式对数据集进行索引访问,也可以使用循环语句来遍历数据集中的每一项记录。 接下来,文章详细列出了Think\Collection类中的常用...

    ojdbc8.jar

    3. 结果集处理:ResultSet接口用于存储查询结果,提供遍历和访问数据库记录的方法。 4. 事务管理:JDBC支持ACID(原子性、一致性、隔离性和持久性)事务特性,使得开发者可以在数据库操作中控制事务的开始、提交、...

    jdbc基础和参考

    executeUpdate:返回int类型的值,代表的是,操作执行完成后,受影响的数据库的行计数(针对于insert,update,delete) executeQuery:返回的是ResultSet ResultSet:类似于指针或者游标的东西,里边保存的不是所有的...

    spring mybatis 调用oracle存储过程

    本文将深入探讨如何在Spring和MyBatis集成环境中调用Oracle数据库的存储过程,包括无返回值、返回结果集以及返回多个结果的情况。 首先,让我们理解基础概念。Spring是一个全面的后端开发框架,它提供了依赖注入、...

    java jquery mongodb/mysql 分页

    在分页查询中,通常会通过设置SQL的LIMIT和OFFSET关键字来限制返回的数据行数,实现分页效果。例如: ```java String sql = "SELECT * FROM table LIMIT ?, ?"; PreparedStatement pstmt = connection.prepare...

    1000道 互联网Java架构师面试题 485页_.pdf

    - SQL 语句通过 SQLSession 执行后,返回 ResultSet。 - MyBatis 根据映射信息(Mapper XML 文件或注解)将 ResultSet 转换为 Java 对象。 8. 批量插入可以通过 `<foreach>` 标签实现,将待插入的数据以集合形式...

    javaweb分页技术详解及代码.pdf

    `LIMIT`后的两个参数分别代表起始位置(从0开始)和返回的记录数。 三、Java Web分页模型 在Java Web中,我们通常会创建一个`PageBean`类来封装分页信息,包括数据对象集合、总记录数、当前页数、每页记录数等...

    mongodb与oralce的数据同步

    2. 读取:使用`find()`方法查询数据,可以指定查询条件,返回一个`FindIterable<Document>`对象,可以通过迭代器遍历结果。 ```java FindIterable<Document> iterable = collection.find(new Document("key", ...

    2021-2022计算机二级等级考试试题及答案No.19582.docx

    14. `ResultSet`对象在Java数据库编程中用于存储查询结果,方便遍历和访问查询结果集。 15. `Connection`对象的作用是表示与数据库的连接,它是访问数据库的基础。 16. 在C语言中,一维数组的定义方式为`类型说明...

    JAVA基础.doc

    Statement用于执行SQL语句,返回ResultSet结果集。 **8.6 PreparedStatement** PreparedStatement是Statement的子类,支持预编译SQL语句,提高了执行效率和安全性。 **8.7 ResultSet** ResultSet用于存储查询...

    java_web_分页

    接下来编写具体的业务逻辑层,负责执行数据库查询并返回分页数据。下面是一个简单的 `EmpBiz` 类实现示例: ```java public class EmpBiz { public PageBean listEmps(int pageNo, int pageCount) { Connection ...

    java面试题及答案

    以上步骤提供了一个简单的示例,展示了如何使用 Java 连接并查询 Oracle 数据库。 #### Java 中的线程安全问题 **问题:** Java 中的 ArrayList 与 Vector 有何区别? **答案:** ArrayList 和 Vector 都是 Java ...

    JAVA工程师开发的经验,很有分量,对于初次接触Web开发的人帮助很大,我就是从初学者过来的,这些都是我的经验!!!

    - 处理查询结果:遍历`ResultSet`对象。 - 关闭资源:关闭`ResultSet`、`Statement`和`Connection`对象。 - **注意事项**: - 异常处理非常重要,建议使用try-with-resources语句来自动关闭资源。 - 使用...

    java笔试题

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 为什么?** - 在Java中,传递的是对象的引用而不是值。因此,方法可以修改传入...

    Java学习攻略.pdf

    13. Java中的数据库编程还涉及SQL的使用,包括Statement、PreparedStatement和ResultSet等接口。 14. Java中的注解(Annotation)是一种用于为Java代码提供元数据的机制,EJB 3.0通过注解简化了企业级应用开发。 ...

Global site tag (gtag.js) - Google Analytics