发帖来源:
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语句的记录集是存在哪里的??

解决方案 »

  1.   

    我的疑问是,resultSet里并没有表这个属性,这个搜出来的符合你sql语句的记录集是存在哪里的?是在数据库里的么?是怎样的啊
      

  2.   

    我的疑问是,resultSet里并没有表这个属性,这个搜出来的符合你sql语句的记录集是存在哪里的?是在数据库里的么?是怎样的啊
      

  3.   

    结果集里有一张虚拟表 next就是往下移动一行 看有没有东西  这个有什么好讨论的啊 拿着用就行了
      

  4.   

    你可以使用java.sql.TPYES 来判断 RS获得的结果集的属性 
    如果,获得了结果集为string(varchar(20))可以通过否则pass
    rs.next()
    大概意思:
    像指针一样 一行行读取数据 而rs.getString(1);意思是说:读取着一行中的第一列的参数!!你可以有TPYES获得结果集之前来判断结果集是否是你想要的属性 如果不是可以PASS!!这样可以带来很大好处!
    通用性强!
      

  5.   

    rs.next()的意思就是将目前正在读取记录向下移动一行,如果没有下一行了就返回false
    你可以认为在executeQuery之后,rs是处于第0行,第一行才是数据的开始。所以while(rs.next())就可以了
      

  6.   

    Resultset是对缓冲区(在数据库中也叫游标)的抽象,select出来的结果集可能包含海量数据,不可能一下子全部送过来,但如果每次一点一点地传送效率又会很低,所以在调用rs.next()时对象rs会检查一下自己所拥有的数据,如果不够的话会向数据库要(猜测可能会预取多行)。参照fread()中体现的I/O缓冲机制就容易理解了。你也说了Resultset是个接口,在接口的定义中当然找不到你所期望的成员。JAVA中的接口就像C++中的纯虚类一样是不可以实例化的,那么你回想一下接口有什么作用?告诉你下面这一句话:stmt.executeQuery()返回的并不是接口而是一个与这个接口赋值兼容的类对象,就该清楚是怎么一回事了。
      

  7.   

    我的理解是你executeQuery查询出数据后,放入一个缓存区,rs.next游标定义到当前记录,循环读取数据,如果没有返回FALSE
      

  8.   

    ResultSet 跟数据库 是一支保持连接的,是在数据库上面建立了一个游标,你就把ResultSet 当成一个游标查询,你就明白了。
    它可以直接跳到N条记录读取。 如果你在while(rs.next){
      con.close();
    }
    那你就会明白了。这里立马就报错了,报数据库refused。ResultSet并不是虚表。只是建立了一个数据库之间的游标,而且一直保持连接。在rs.next没有读完,连接是不能关闭的。也就是每条读取都跟数据库交换。只是建立了一个游标查询而已。不信你搞个数据库,试试。
      

  9.   

    楼主问的问题我看不太懂啊·~~可能你把问题想的太具体了通俗点可理解为
    ResultSet它就是用来表示查询结果的类~它是接口但要被具体的类实现的嘛
    它提供一些方法如next()getxxxx()帮你得到想要的信息。至于这些方法是怎么实现的,查询结果的数据结构怎么设计储存的, 估计查询下文档应该能知道吧·~至于你想像中的虚表,程序里是不可能具体表示的,估计是把查询结果每一行记录放在一个字符串或类
    然后所有的记录也就是所有字符串或类放在一个集合里(list或set)。然后应该在ResultSet里定义一些辅助属性
    如当前指向的记录的位置,总的记录数等等,通过这些属性就可以取出集合里具体位置的数据了。完全是个人没有依据非常土的看法~~不要在意~呵呵~
      

  10.   


    迷迷糊糊的,还是有点好奇,它建立游标后,我要查的记录集是一个集合,你游标只指向一条记录,你意思是说,我不是先把所有的符合的结果都抽出来成一张表,而是在查询的那张表上指了一个指针么?然后我next()就去查下一个符合的么?
    周一结贴。
      

  11.   

    对,我可能没问明白,我就是想问,http://java.sun.com/j2se/1.3/docs/api/index.html  在Java文档里我就是好奇那个resultset里并没有如我所想像的有一个 能放结果 的一个集合的属性。我就有点奇怪它放哪里了,所以问问。
      

  12.   

    我觉得从数据库查出来的东西,一般都是放在计算机的内存里面的,连接数据库后,应该会在内存里面建立有临时的数据库,
    ResultSet 从内存里面读取东西,因为起点不是指向第一行数据,所以要用next()方法,让游标向前移动到第一行那,如果不
    移动,直接用ResultSet 对象取值,就会发生异常。要说的明白比较难,想了解,为什么一定要用next()方法呢,最好,去看ResultSet 这个类的源代码/
      

  13.   

     建议搂住把孙卫琴的 hibernate看一下 讲解的比较清晰
      

  14.   

    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