既然我们把数据库访问封装起来了,那么如果查询数据库返回的是一系列结果,比如我们从数据库中得到所有人的用户名,然后在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没区别,还是浪费内存。
分享到:
相关推荐
在完成数据库操作后,记得将连接返回到池中,而不是关闭它:`ds.close()`。 文档通常会涵盖这些连接方法的详细步骤、配置参数、异常处理等信息。例如,`002ConnectDataBase`可能包含具体的示例代码、配置文件以及...
在Java开发中,有时我们需要与数据库进行深度交互,这时候存储过程就显得尤为重要。特别是当涉及到复杂的业务逻辑或者数据处理时,Oracle数据库中的存储过程能够提供更高效和安全的解决方案。本话题将详细讲解如何...
查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...
13. JDBC方法行为:`Statement`的`executeQuery()`返回一个`ResultSet`对象,用于存储查询结果。`executeUpdate()`返回的是受影响的行数,而非布尔值。`ResultSet`的`getString()`方法可以获取`CHAR`类型的值。描述...
选项A和B正确,CREATE是DDL(数据定义语言),用于创建数据库对象,SELECT是查询语言,不属于DML。 4. **设置SQL*Plus页面大小**:在SQL*Plus中,设置每页显示行数的命令是`set pagesize 20`或`set pages 20`,选项...
`即可执行数据库的查询操作并返回数据集对象。在这个基础上,可以使用类似数组的方式对数据集进行索引访问,也可以使用循环语句来遍历数据集中的每一项记录。 接下来,文章详细列出了Think\Collection类中的常用...
3. 结果集处理:ResultSet接口用于存储查询结果,提供遍历和访问数据库记录的方法。 4. 事务管理:JDBC支持ACID(原子性、一致性、隔离性和持久性)事务特性,使得开发者可以在数据库操作中控制事务的开始、提交、...
executeUpdate:返回int类型的值,代表的是,操作执行完成后,受影响的数据库的行计数(针对于insert,update,delete) executeQuery:返回的是ResultSet ResultSet:类似于指针或者游标的东西,里边保存的不是所有的...
本文将深入探讨如何在Spring和MyBatis集成环境中调用Oracle数据库的存储过程,包括无返回值、返回结果集以及返回多个结果的情况。 首先,让我们理解基础概念。Spring是一个全面的后端开发框架,它提供了依赖注入、...
在分页查询中,通常会通过设置SQL的LIMIT和OFFSET关键字来限制返回的数据行数,实现分页效果。例如: ```java String sql = "SELECT * FROM table LIMIT ?, ?"; PreparedStatement pstmt = connection.prepare...
- SQL 语句通过 SQLSession 执行后,返回 ResultSet。 - MyBatis 根据映射信息(Mapper XML 文件或注解)将 ResultSet 转换为 Java 对象。 8. 批量插入可以通过 `<foreach>` 标签实现,将待插入的数据以集合形式...
`LIMIT`后的两个参数分别代表起始位置(从0开始)和返回的记录数。 三、Java Web分页模型 在Java Web中,我们通常会创建一个`PageBean`类来封装分页信息,包括数据对象集合、总记录数、当前页数、每页记录数等...
2. 读取:使用`find()`方法查询数据,可以指定查询条件,返回一个`FindIterable<Document>`对象,可以通过迭代器遍历结果。 ```java FindIterable<Document> iterable = collection.find(new Document("key", ...
14. `ResultSet`对象在Java数据库编程中用于存储查询结果,方便遍历和访问查询结果集。 15. `Connection`对象的作用是表示与数据库的连接,它是访问数据库的基础。 16. 在C语言中,一维数组的定义方式为`类型说明...
Statement用于执行SQL语句,返回ResultSet结果集。 **8.6 PreparedStatement** PreparedStatement是Statement的子类,支持预编译SQL语句,提高了执行效率和安全性。 **8.7 ResultSet** ResultSet用于存储查询...
接下来编写具体的业务逻辑层,负责执行数据库查询并返回分页数据。下面是一个简单的 `EmpBiz` 类实现示例: ```java public class EmpBiz { public PageBean listEmps(int pageNo, int pageCount) { Connection ...
以上步骤提供了一个简单的示例,展示了如何使用 Java 连接并查询 Oracle 数据库。 #### Java 中的线程安全问题 **问题:** Java 中的 ArrayList 与 Vector 有何区别? **答案:** ArrayList 和 Vector 都是 Java ...
- 处理查询结果:遍历`ResultSet`对象。 - 关闭资源:关闭`ResultSet`、`Statement`和`Connection`对象。 - **注意事项**: - 异常处理非常重要,建议使用try-with-resources语句来自动关闭资源。 - 使用...
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 为什么?** - 在Java中,传递的是对象的引用而不是值。因此,方法可以修改传入...
13. Java中的数据库编程还涉及SQL的使用,包括Statement、PreparedStatement和ResultSet等接口。 14. Java中的注解(Annotation)是一种用于为Java代码提供元数据的机制,EJB 3.0通过注解简化了企业级应用开发。 ...