关于ResultSet.next()的问题
请问一个ResultSet.next()的问题如果执行一次ResultSet.next()之后,通过别的途径把第2条数据删了,那么再次执行ResultSet.next()的时候,能不能得到已经删除的第2条数据; 还是得到原来状态的第三条数据?换句话书,ResultSet.next()开启的游标是静态游标还是动态游标?

解决方案 »

  1.   

    //新曙光培训@西安
    //www.xinshuguang.org
    import java.util.*;
    public class xsgNext{
        public static void main(String[] args){
            List list=new ArrayList();
            for(int i=0;i<10;i++)
               list.add(i);
            Iterator it=list.iterator();
             while(it.hasNext())
                System.out.println(it.next());
            list.remove(new Integer(3));
            //有上一句就要重新做遍历器
            //用原来的就无法输出了
            Iterator itAgain=list.iterator();
            while(itAgain.hasNext())
             System.out.println(itAgain.next());
          }
    }
      

  2.   

    这个要看你删除的是哪里的数据,resultSet中存的一张虚拟表,和数据库中的是两个不同的表,如果你把数据库中的第二行删除,不会影响resultSet中的数据.只有删除resultSet中的数据才会影响.
      

  3.   


    这位大虾是对的,不过要提醒的是一个ResultSet只能有一次next,如果定义了ResultSet st1,st2;
    st2=st1;当对st1进行st1.next()后之后,st2.next()就是空了
      

  4.   

    游标是静态的还是动态的要看获取到 ResultSet 的 Statement 对象的 resultSetType 属性即结果集类型,如果类型是 ResultSet.TYPE_FORWARD_ONLY 或 ResultSet.TYPE_SCROLL_INSENSITIVE 类型的那数据库数据发生变化对结果集没影响,如果是 ResultSet.TYPE_SCROLL_SENSITIVE 类型的那么数据库数据的变化会反映到结果集中。
      

  5.   

    ResultSet 是一张虚表,如果你读取数据的时候,别人把它删除,读的就是“脏”数据
      

  6.   

    11个人中只有10楼基本懂JDBC,其它没有一个懂.结果集类型中如果是TYPE_SCROLL_INSENSITIVE的,删除数据库存数据不会影响结果集.但如果是TYPE_SCROLL_SENSITIVE的呢?
    这就要看操作类型和数据库具体实现了.一般而言,delete和insert不影响,但update就影响.原因:我们以"select name,age from person"为例
    TYPE_SCROLL_INSENSITIVE的结果集是数据库中的cache,也就是上面说的虚拟表,和真实的数据库数据是分离的.
    这里在数据库中有一个cache,它保存中查询出来的name,age,和原表脱离.
    TYPE_SCROLL_SENSITIVE在数据库中也有一张虚拟表,但cache的内容不同.它cache的是记录的rowid(这只是一个名词,不是oracle的rowid)
    简单说它保存的是查询到的记录在实际数据库中的索引.当rs.next()时,数据库再根据next定位的rowid却数据库中真实地获取.
    即每一次next,数据库都会 select name,age from person where rowid = 当前rowid;
    所以如果在查询的时候记录被更新,内容就真实地反映到前端的java的结果集中了.
    但是insert操作是新增rowid,并不在cache的rowid中.所以不影响前端的结果集.
    而delete操作,一般而言,因为只是在记录上做了一个标记,并没有真正删除记录,对于数据库底层的
    select name,age from person where rowid = 当前rowid;而言还是可以取得数据.这一点可以用程序验证出来.做一个TYPE_SCROLL_SENSITIVE类型的ResultSet.
    其中的数据手工插入,内容我们预先知道,比如name都是"axman1","axman2"....."axmann".
    然后rs.next();每next一次记数加1 .当记数为2时,Thread.sleep(10*1000);在这10秒内你把2以下的其中一个记录的name更新为"xxxxxxx";
    另一条记录删除,可以看到更新的内容反映出来了,但删除的记录照样打印出来,也就是实际没有反映出来.
      

  7.   

    另外,JDBC只是一个规范,你不能指望所有行为和规范规定的一样.比如返回插入的主键,现在只有mysql实现了.其它都不支持.