ResultSet 游标控制

之前在建立Statement或 PreparedStatement,您所使用的是Connection无参数的createStatement()与 preparedStatement(),这样取得的Statement其执行SQL后得到的ResultSet,将只能使用next()方法逐笔取得查询结果。

您可以在建立Statement事务时指定resultSetType,可指定的参数有 ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE与 ResultSet.TYPE_SCROLL_SENSITIVE,在不指定的情况下,预设是第一个,也就是只能使用next()来逐笔取得资料,指定第二个或第三个,则可以使用ResultSet的afterLast()、previous()、absolute()、relative()等方法。

ResultSet.TYPE_SCROLL_INSENSITIVE与ResultSet.TYPE_SCROLL_SENSITIVE 的差别在于能否取得ResultSet改变值后的资料,另外您还必须指定resultSetConcurrency,有 ResultSet.CONCUR_READ_ONLY与ResultSet.CONCUR_UPDATABLE两个参数可以设定,前者表示只能读取 ResultSet的资料,后者表示可以直接使用ResultSet来操作资料库,这会在下一个主题后说明。

createStatement()不给定参数时,预设是ResultSet.TYPE_FORWARD_ONLY、 ResultSet.CONCUR_READ_ONLY。

这边先示范如何控制ResultSet的读取游标,在建立Statement时,您使用 ResultSet.TYPE_SCROLL_INSENSITIVE及ResultSet.CONCUR_READ_ONLY即可,下面这个例子示范从查询到的资料最后一笔开始往前读取:

Statement stmt = conn.createStatement(
                          ResultSet.TYPE_SCROLL_INSENSITIVE, 
                          ResultSet.CONCUR_READ_ONLY);
ResultSet result = stmt.executeQuery(
                          "SELECT * FROM message");
result.afterLast();
while(result.previous()) {
     System.out.print(result.getString("name") + "\t");
     System.out.print(result.getString("email") + "\t");
     System.out.print(result.getString("subject") + "\t");
     System.out.print(result.getString("time") + "\t");
     System.out.println(result.getString("memo") + "\t");
}
stmt.close();
conn.close();

 

afterLast()会将ResultSet的读取游标移至最后一笔资料之后,您使用previous()方法往前移动读取游标。

您也可以使用absolute()方法指定查询到的资料之位置,例如absolute(4)表示第四笔资料,absoulte(10)则是第十笔资料,如果指定负数,则从最后往前数,例如absolute(-1)则是最后一笔资料,若有100笔资料,absoulte(-4)则是第97笔资料。

relative()方法则从目前游标处指定相对位置,例如若目前在第25笔资料,则relative(-2)则表示第23笔资料,而relative (4)则表示第29笔资料。

另外还有beforeFirst(),可以将游标移至资料的第一笔之前,first()可以将游标移至第一笔资料,而last()可以将游标移至最后一笔资料。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,ResultSet游标溢出通常是指当ResultSet对象中的数据量较大时,ResultSet对象的游标无法容纳所有数据,因此可能会出现异常。 ResultSet游标在Java中是一个指向ResultSet对象中当前行的指针。当我们使用ResultSet对象从数据库中检索数据时,ResultSet对象会将数据存储在内存中,并使用游标来跟踪当前行。 当ResultSet对象中的数据量很大时,ResultSet对象可能无法容纳所有数据,因此可能会出现游标溢出异常。这种情况通常会发生在以下情况下: 1. 当ResultSet对象中的数据超过了JVM的内存限制时。 2. 当ResultSet对象被关闭时,游标指针无法再次访问ResultSet对象中的数据。 为了避免ResultSet游标溢出异常,可以尝试以下方法: 1. 使用分页查询:如果ResultSet对象中的数据量很大,可以使用分页查询来减少ResultSet对象中的数据量。 2. 使用ResultSet的滚动模式:使用ResultSet的滚动模式可以让ResultSet对象的游标ResultSet对象中向前或向后滚动,从而避免游标溢出异常。 3. 使用JDBC的fetchSize属性:可以通过设置JDBC的fetchSize属性来控制ResultSet对象中数据的数量,从而避免ResultSet游标溢出异常。 总之,ResultSet游标溢出异常是一个常见的异常,在使用ResultSet对象时需要特别注意。可以通过使用分页查询、滚动模式和设置JDBC的fetchSize属性来避免这种异常的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值