`
demojava
  • 浏览: 548879 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

    博客分类:
  • JAVA
阅读更多

既然我们把数据库访问封装起来了,那么如果查询数据库返回的是一系列结果,比如我们从数据库中得到所有人的用户名,然后在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没区别,还是浪费内存。

分享到:
评论

相关推荐

    java使用jdbc连接数据库简单实例

    总结来说,这个简单的Java JDBC实例演示了如何使用DBCP连接池连接到MySQL数据库,并执行SQL查询。通过理解这些基础知识,开发者可以构建更复杂的数据操作功能,如插入、更新和删除数据,以及事务处理等。

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

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

    JDBC(oracle)java测试题.pdf

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

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

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

    jdbc基础和参考

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

    JDBC(oracle)java测试题.docx

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

    springmybatis

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

    ojdbc8.jar

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

    Vert-x-通过异步的方式使用JDBC连接SQL

    在本文中,我们将探讨如何在Vert.x应用程序中利用异步的方式通过JDBC连接到SQL数据库,特别是使用HSQLDB,但该方法同样适用于其他支持JDBC的数据库。Vert.x是一个高度反应式的Java框架,其核心特性之一就是异步编程...

    java 面试提升 java 面试提升

    `ResultSet`表示查询结果。 2. **存储过程**:在数据库中预编译的SQL语句集,通过`CallableStatement`调用。例如,设置输入参数和输出参数,然后执行并获取结果。 3. **JDBC连接数据库**:通常包括驱动加载、...

    58-初级软件开发工程师(Java)考试大纲.docx

    * JDBC API(Connection、Statement、ResultSet、PreparedStatement) * 设置 FetchSize * Statement 缓存结果集缓存 * 使用 JDBC 访问 Oracle 数据库 * 使用 CallableStatement 接口实现对数据库中存储过程的调用 *...

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

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

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

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

    mongodb与oralce的数据同步

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

    jsp二期学习笔记(北大青鸟二期学习)

    1. **JDBC-ODBC Bridge**:早期的JDBC实现方式,通过ODBC桥接器与数据库通信。现在已经很少使用。 - 驱动类:`sun.jdbc.odbc.JdbcOdbcDriver` - URL 示例:`jdbc:odbc:DataSourceName` 2. **Native-API Partial ...

    学习有关连接池的使用

    在配置了连接池后,需要确保Tomcat能够找到对应的数据库驱动。这通常意味着将数据库驱动的JAR文件(例如sqljdbc.jar)放入Tomcat的`common/lib`目录下,这样Tomcat在启动时就能加载该驱动。 接下来,我们来看如何在...

    使用JSP开发Web应用程序__总结.doc

    - 如果是查询语句,则通过`ResultSet`处理结果集。 - 最后关闭连接和相关资源。 以上就是关于使用JSP开发Web应用程序的一些核心知识点,涵盖了动态网站开发的基础概念、使用集合存储对象的方法以及如何利用JDBC ...

    Java课程设计超市管理系统设计实现(20210806160245).pdf

    - `ResultSet`:表示数据库结果集的数据表,可滚动和更新。 ### 3. 数据库设计和SQL语句 超市管理系统需要处理的商品信息、供应商信息、用户信息等均通过关系型数据库进行存储。文档中提到了商品表(commodity),...

    Mybatis.docx

    总的来说,MyBatis 是一种轻量级的 ORM(对象关系映射)框架,它简化了 JDBC 编程,提高了开发效率,同时保持了对 SQL 语句的直接控制,使得开发者能够根据数据库特性写出高效的查询。通过配置文件和映射文件,...

Global site tag (gtag.js) - Google Analytics