原文地址:http://zpnest.blog.sohu.com/28905212.html
想把数据库中的几条记录显示出来,结果折腾了半天也没弄成,总找不到原因,后来干脆就在读数据之前用了个rs.next(),在读取数据,这次没问题了!
后来才发现
ResultSet 维护指向其当前数据行的光标。每调用一次 next() 方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用 next 将把光标置于第一行上,使它成为当前行。随着每次调用 next 导致光标向下移动一行,按照从上至下的次序获取 ResultSet 行。
1. 我们通过JDBC查询,是否一次是把所有的结果集查询出来后放到ResultSet中。
2. 在调用ResultSet.next()方法的时候,是否还会和数据库交互。
其实在以前我一直认为当statement执行完sql语句后,它会把结果集保存到ResultSet中,然后关闭这个cursor,当实际上并不是这样的。
今天写的一个javabean:
开始把
放入了函数
中,想到每次调用都会创建一个新的stmt变量,这样太浪费资源,于是就把
放入构造函数中,使用的时候直接使用该实例即可。在jsp页面中使用该javabean。
该jsp页面在运行时会抛出ResultSet is colsed异常,注意蓝色代码部分调用了executeQuery();方法,此时javabean中执行的是executeQuery(select * from table1);返回的数据集“rs”也是该语句执行的结果。
执行到蓝色代码时也调用了executeQuery();此时执行的是调用了executeQuery(select count(*) as mycount from table1);返回的数据集rsTmp就是该语句的执行结果。
注意:两次使用了同一个stmt的executeQuery()方法。
此后再使用数据集rs时就会抛出ResultSet is colsed异常,因为此时数据集rs与数据库中间的联系stmt.executeQuery(select * from table1)已经发生了变化。已经变成stmt.executeQuery(select count(*) as mycount from table1).如果采用先前的写法把Statement stmt=connect.createStatement();放入了函数public ResultSet executeQuery(String sql)中就不会出现这种问题。
通过上面分析,我们可以的出结论通过JDBC查询结果集不是直接放到ResultSet中,ResultSet存在的可能是结果集的指针。我们在使用ResultSet时仍然需要和数据库交互。