关于rs.next()

lingling1989r 2009-06-13 09:04:44
发帖来源:
http://topic.csdn.net/t/20020427/09/680409.html


关于rs.next()的理解的一些我也有过的误区。
rs.next()表示的是什么,是不是检验rs的下一个是否为空,如果不为空,rs的下一个的值赋予rs?
帖子里这么问了一句。
首先是ResultSet rs的理解有误。“rs的下一个”和“rs的下一个的值赋予rs”。ResultSet rs.rs是一个Resultset是一个接口。我这么理解的。就把rs理解成一个table,执行完sql语句后得到的结果就全放到这个table里了。rs.next()不是rs的next是什么。rs有一个游标的域,游标初始时指向rs的table的前一行,所以当table不为空时候。while(rs.next()){}是从第一行进行对其操作的。而如果记录集为空的话,也不可以用if(rs==null)来进行判断,因为你都已经创建出来ResultSet了,怎么会为null呢,也解释了 http://www.cnblogs.com/xnxqs/archive/2005/05/23/160863.html .的一些说法。next()是rs实例的一个方法,它返回的是该记录集的下一行。所以判断是否 sql语句查询的记录集为空时候,应该用if(rs.next())来进行判断。rs.next()进入表的第一行,next()函数返回值说明如下,
Returns:true if the new current row is valid; false if there are no more rows
而你的记录集表为空,所以返回false,就对了。

我的疑问是,resultSet里并没有表啊,这个搜出来的符合你sql语句的记录集是存在哪里的??
...全文
1758 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
y2009270076 2011-05-18
  • 打赏
  • 举报
回复
1、rs = stmt.exeQuery(sql)后,rs肯定不会为null,注意,是rs对象不会为null,而不是其包含的result
2、既然rs不会为null,所以在rs = stmt.exeQuery(sql)后,使用while(rs.next())或者if(rs.next())时就不用判断rs != null;
3、rs.next时,游标最先是指向第一条记录前的位置,所以第一次rs.next后,游标指向的正好是第一条记录(如果有的话)
4、要判断rs的结果是否为空,只要使用一次rs.next方法就行了,如果它返回为false,则证明rs的结果为null
转自http://ml365.iteye.com/blog/838949
sinpinle 2009-06-21
  • 打赏
  • 举报
回复
建议搂住把孙卫琴的 hibernate看一下 讲解的比较清晰
s2chen02 2009-06-21
  • 打赏
  • 举报
回复
我觉得从数据库查出来的东西,一般都是放在计算机的内存里面的,连接数据库后,应该会在内存里面建立有临时的数据库,
ResultSet 从内存里面读取东西,因为起点不是指向第一行数据,所以要用next()方法,让游标向前移动到第一行那,如果不
移动,直接用ResultSet 对象取值,就会发生异常。要说的明白比较难,想了解,为什么一定要用next()方法呢,最好,去看ResultSet 这个类的源代码/
lingling1989r 2009-06-20
  • 打赏
  • 举报
回复
对,我可能没问明白,我就是想问,http://java.sun.com/j2se/1.3/docs/api/index.html 在Java文档里我就是好奇那个resultset里并没有如我所想像的有一个 能放结果 的一个集合的属性。我就有点奇怪它放哪里了,所以问问。
lingling1989r 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 keyboardsun 的回复:]
ResultSet 跟数据库 是一支保持连接的,是在数据库上面建立了一个游标,你就把ResultSet 当成一个游标查询,你就明白了。
它可以直接跳到N条记录读取。

如果你在while(rs.next){
con.close();
}
那你就会明白了。这里立马就报错了,报数据库refused。

ResultSet并不是虚表。只是建立了一个数据库之间的游标,而且一直保持连接。在rs.next没有读完,连接是不能关闭的。也就是每条读取都跟数据库交换。只是建立了…
[/Quote]

迷迷糊糊的,还是有点好奇,它建立游标后,我要查的记录集是一个集合,你游标只指向一条记录,你意思是说,我不是先把所有的符合的结果都抽出来成一张表,而是在查询的那张表上指了一个指针么?然后我next()就去查下一个符合的么?
周一结贴。
Roy_MrLi208 2009-06-19
  • 打赏
  • 举报
回复
就是一张虚表,之后用指针指示,一行一行的向下移动去读取表的内容~
yooyoozoo 2009-06-17
  • 打赏
  • 举报
回复
标记向下一格,从表头开始
ChDw 2009-06-17
  • 打赏
  • 举报
回复
rs.next()的意思就是将目前正在读取记录向下移动一行,如果没有下一行了就返回false


你可以认为在executeQuery之后,rs是处于第0行,第一行才是数据的开始。所以while(rs.next())就可以了
lingling1989r 2009-06-17
  • 打赏
  • 举报
回复
可是在结果集里,它的成员变量中没有看到这张虚表在哪里啊。是哪个变量代表的。说清楚点。就是迷糊。多谢。
samgmin 2009-06-17
  • 打赏
  • 举报
回复
你可以使用java.sql.TPYES 来判断 RS获得的结果集的属性
如果,获得了结果集为string(varchar(20))可以通过否则pass
rs.next()
大概意思:
像指针一样 一行行读取数据 而rs.getString(1);意思是说:读取着一行中的第一列的参数!!

你可以有TPYES获得结果集之前来判断结果集是否是你想要的属性 如果不是可以PASS!!这样可以带来很大好处!
通用性强!
jeffzhao520 2009-06-17
  • 打赏
  • 举报
回复
楼主问的问题我看不太懂啊·~~可能你把问题想的太具体了

通俗点可理解为
ResultSet它就是用来表示查询结果的类~它是接口但要被具体的类实现的嘛
它提供一些方法如next()getxxxx()帮你得到想要的信息。

至于这些方法是怎么实现的,查询结果的数据结构怎么设计储存的, 估计查询下文档应该能知道吧·~

至于你想像中的虚表,程序里是不可能具体表示的,估计是把查询结果每一行记录放在一个字符串或类
然后所有的记录也就是所有字符串或类放在一个集合里(list或set)。然后应该在ResultSet里定义一些辅助属性
如当前指向的记录的位置,总的记录数等等,通过这些属性就可以取出集合里具体位置的数据了。

完全是个人没有依据非常土的看法~~不要在意~呵呵~
keyboardsun 2009-06-17
  • 打赏
  • 举报
回复
ResultSet 跟数据库 是一支保持连接的,是在数据库上面建立了一个游标,你就把ResultSet 当成一个游标查询,你就明白了。
它可以直接跳到N条记录读取。

如果你在while(rs.next){
con.close();
}
那你就会明白了。这里立马就报错了,报数据库refused。

ResultSet并不是虚表。只是建立了一个数据库之间的游标,而且一直保持连接。在rs.next没有读完,连接是不能关闭的。也就是每条读取都跟数据库交换。只是建立了一个游标查询而已。不信你搞个数据库,试试。
  • 打赏
  • 举报
回复
我的理解是你executeQuery查询出数据后,放入一个缓存区,rs.next游标定义到当前记录,循环读取数据,如果没有返回FALSE
uwinb 2009-06-17
  • 打赏
  • 举报
回复
Resultset是对缓冲区(在数据库中也叫游标)的抽象,select出来的结果集可能包含海量数据,不可能一下子全部送过来,但如果每次一点一点地传送效率又会很低,所以在调用rs.next()时对象rs会检查一下自己所拥有的数据,如果不够的话会向数据库要(猜测可能会预取多行)。参照fread()中体现的I/O缓冲机制就容易理解了。

你也说了Resultset是个接口,在接口的定义中当然找不到你所期望的成员。JAVA中的接口就像C++中的纯虚类一样是不可以实例化的,那么你回想一下接口有什么作用?告诉你下面这一句话:stmt.executeQuery()返回的并不是接口而是一个与这个接口赋值兼容的类对象,就该清楚是怎么一回事了。
shanchailee 2009-06-14
  • 打赏
  • 举报
回复
接分
rosielvivi 2009-06-14
  • 打赏
  • 举报
回复
结果集里有一张虚拟表 next就是往下移动一行 看有没有东西 这个有什么好讨论的啊 拿着用就行了
cbynietg 2009-06-14
  • 打赏
  • 举报
回复
不懂.
lingling1989r 2009-06-14
  • 打赏
  • 举报
回复
我的疑问是,resultSet里并没有表这个属性,这个搜出来的符合你sql语句的记录集是存在哪里的?是在数据库里的么?是怎样的啊
lingling1989r 2009-06-14
  • 打赏
  • 举报
回复
我的疑问是,resultSet里并没有表这个属性,这个搜出来的符合你sql语句的记录集是存在哪里的?是在数据库里的么?是怎样的啊
岁月之梦 2009-06-13
  • 打赏
  • 举报
回复
说什么呢 ?
加载更多回复(1)
package cn.com.dao.chivementdao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import cn.com.util.DBConnection; import cn.com.util.DBSql; import cn.com.vo.chivementvo.ChivementVo; public class ExamDao { private Connection conn = DBConnection.getConnectionOracle(); private ChivementVo examVo; public ExamDao() { } public ExamDao(ChivementVo examVo) { super(); this.examVo = examVo; } /** * 全部查询 */ public Object[][] selectAll() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_ALL); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumberAll(DBSql.SELECT_ALL_COUNT)][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据学号查询 */ public Object[][] selectBySid() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_S_ID); ps.setInt(1, examVo.getS_id()); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumber(DBSql.SELECT_BY_S_ID_COUNT, examVo .getS_id())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据组号查询 */ public Object[][] selectByGid() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_G_ID); ps.setInt(1, examVo.getG_id()); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumber(DBSql.SELECT_BY_G_ID_COUNT, examVo .getG_id())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据课程号查询 */ public Object[][] selectByCid() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_C_ID); ps.setInt(1, examVo.getC_id()); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumber(DBSql.SELECT_BY_C_ID_COUNT, examVo .getC_id())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { // System.out.println( examVo.getG_id()); date[i][j] = rs.getObject(j+1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据姓名模糊查询 * * @return */ public Object[][] selectByName() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_S_NAME); ps.setString(1, examVo.getS_name()); ps.setString(2, "%" + examVo.getS_name() + "%"); ps.setString(3, "%" + examVo.getS_name()); ps.setString(4, examVo.getS_name() + "%"); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumberByName(DBSql.SELECT_BY_S_NAME_COUNT, examVo.getS_name())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据课程名称模糊查询 * * @return */ public Object[][] selectByClassName() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_CLASS_NAME); ps.setString(1, examVo.getClass_name()); ps.setString(2, "%" + examVo.getClass_name() + "%"); ps.setString(3, "%" + examVo.getClass_name()); ps.setString(4, examVo.getClass_name() + "%"); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumberByName(DBSql.SELECT_BY_CLASS_COUNT, examVo.getClass_name())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 修改选中学生的成绩 * */ public void updatSelectClass() { PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.UPDATE_EXAM_BY_STUID); ps.setInt(1, examVo.getClassExamChivement()); ps.setInt(2, examVo.getS_id()); ps.setInt(3, examVo.getC_id()); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } /** * 得到所有课程号和课程名 * * @return */ public String[] getClassNoName() { String[] classNoName = null; PreparedStatement ps = null; ResultSet rs = null; int j = 0; try { int i = getnumberAll(DBSql.SELECT_CLASS_NAME_COUNT); classNoName = new String[i + i]; ps = conn.prepareStatement(DBSql.SELECT_CLASS_NAME); rs = ps.executeQuery(); while (rs.next()) { classNoName[j] = rs.getString(1); classNoName[j + i] = rs.getString(2); j++; } } catch (SQLException e) { e.printStackTrace(); } return classNoName; } /** * 根据科目修改成绩 查询学号 姓名 成绩 * */ public void SelectClassStuName() { int i = 0; PreparedStatement ps = null; ResultSet rs = null; int j = getnumberBySelectClassName( DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM_COUNT, examVo.getC_id()); int[] sNum = new int[j]; String[] sName = new String[j]; int[] classExam = new int[j]; try { ps = conn.prepareStatement(DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM); ps.setInt(1, examVo.getC_id()); rs = ps.executeQuery(); while (rs.next()) { sNum[i] = rs.getInt(1); sName[i] = rs.getString(2); classExam[i] = rs.getInt(3); i++; } } catch (SQLException e) { e.printStackTrace(); } examVo.setSid(sNum); examVo.setSname(sName); examVo.setClassExam(classExam); } /** * 根据科目修改成绩 查询学号 姓名 成绩 后修改成绩 * */ public void UpdateClassStuName() { // int i = 0; PreparedStatement ps = null; ResultSet rs = null; int j = getnumberBySelectClassName( DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM_COUNT, examVo.getC_id()); try { ps = conn.prepareStatement(DBSql.UPDATE_CHIVEMENT_BY_CLASS); for(int i =0;irs = null; try { ps = conn.prepareStatement(str); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return number; } /** * 根据学号 根据组号 根据课程号查询 获得行数 * * @return */ public int getnumber(String str, int i) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); ps.setInt(1, i); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return number; } /** * 根据姓名 课程名 查询 获得行数 * */ public int getnumberByName(String str, String i) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); ps.setString(1, i); ps.setString(2, "%" + i + "%"); ps.setString(3, "%" + i); ps.setString(4, i + "%"); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); } catch (SQLException e) { e.printStackTrace(); } return number; } // /** // * 根据课程名查询 获得行数 // * // */ // // public int getnumberByClassName(String str, String i) { // int number = 0; // PreparedStatement ps = null; // ResultSet rs = null; // try { // ps = conn.prepareStatement(str); // ps.setString(1, i); // ps.setString(2, "%" + i + "%"); // ps.setString(3, "%" + i); // ps.setString(4, i + "%"); // rs = ps.executeQuery(); // rs.next(); // number = rs.getInt(1); // } catch (SQLException e) { // e.printStackTrace(); // } // return number; // } /** * * 根据课程名修改成绩获得行数 * * @param str * @param i * @return */ public int getnumberBySelectClassName(String str, int i) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); ps.setInt(1, i); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); } catch (SQLException e) { e.printStackTrace(); } return number; } }

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧