关于ResultSet.next()的问题

GEMPMGR 2008-09-16 11:11:21

关于ResultSet.next()的问题


请问一个ResultSet.next()的问题

如果执行一次ResultSet.next()之后,通过别的途径把第2条数据删了,那么再次执行ResultSet.next()的时候,能不能得到已经删除的第2条数据; 还是得到原来状态的第三条数据?

换句话书,ResultSet.next()开启的游标是静态游标还是动态游标?
...全文
867 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
老班长涛哥 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zjx2388 的回复:]
引用 7 楼 chenxinhong98 的回复:
这个要看你删除的是哪里的数据,resultSet中存的一张虚拟表,和数据库中的是两个不同的表,如果你把数据库中的第二行删除,不会影响resultSet中的数据.只有删除resultSet中的数据才会影响.


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


支持!
zjx2388 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chenxinhong98 的回复:]
这个要看你删除的是哪里的数据,resultSet中存的一张虚拟表,和数据库中的是两个不同的表,如果你把数据库中的第二行删除,不会影响resultSet中的数据.只有删除resultSet中的数据才会影响.
[/Quote]

这位大虾是对的,不过要提醒的是一个ResultSet只能有一次next,如果定义了ResultSet st1,st2;
st2=st1;当对st1进行st1.next()后之后,st2.next()就是空了
酒浪子 2008-09-17
  • 打赏
  • 举报
回复
这个要看你删除的是哪里的数据,resultSet中存的一张虚拟表,和数据库中的是两个不同的表,如果你把数据库中的第二行删除,不会影响resultSet中的数据.只有删除resultSet中的数据才会影响.
kwinerly 2008-09-17
  • 打赏
  • 举报
回复
得到的应该是第3个数据了吧~~第2个数据都没了~哪个大虾来指点指点哈咧~~等待
yanxia611 2008-09-17
  • 打赏
  • 举报
回复



应该是静态游标吧
hanbb 2008-09-17
  • 打赏
  • 举报
回复
估计是静态游标
hanbb 2008-09-17
  • 打赏
  • 举报
回复
静态游标
wingheng 2008-09-17
  • 打赏
  • 举报
回复
我觉得是取得的第三条数据
axman 2008-09-17
  • 打赏
  • 举报
回复
另外,JDBC只是一个规范,你不能指望所有行为和规范规定的一样.比如返回插入的主键,现在只有mysql实现了.其它都不支持.
axman 2008-09-17
  • 打赏
  • 举报
回复
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";
另一条记录删除,可以看到更新的内容反映出来了,但删除的记录照样打印出来,也就是实际没有反映出来.
s32702 2008-09-17
  • 打赏
  • 举报
回复
ResultSet 是一张虚表,如果你读取数据的时候,别人把它删除,读的就是“脏”数据
sagezk 2008-09-17
  • 打赏
  • 举报
回复
游标是静态的还是动态的要看获取到 ResultSet 的 Statement 对象的 resultSetType 属性即结果集类型,如果类型是 ResultSet.TYPE_FORWARD_ONLY 或 ResultSet.TYPE_SCROLL_INSENSITIVE 类型的那数据库数据发生变化对结果集没影响,如果是 ResultSet.TYPE_SCROLL_SENSITIVE 类型的那么数据库数据的变化会反映到结果集中。
xinshuguang 2008-09-16
  • 打赏
  • 举报
回复
//新曙光培训@西安
//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());
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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