我们在读取数据库的时候,在读取取到的值的时候,可能要前后挪动指针,例如我们先计算有多少条消息,这时我们就必需把指针移到最后再来计算,然后再把指针移到最前面,逐条读取,有时我们只需逐条读取就能够了。只需要读取的时候,为了不摧毁数据,我们以只读形式读取,有时我们必需往数据库里添加数据,这时我们将模式设置成可更新数据库的形式。
常用方法:
public boolean previous(); //将游标向上挪动,返回boolean型数据,当移到数据集第一行之前时返回false。
public void beforeFirst(); //将游标挪动到数据集的初始位置,即在第一行之前。
public void afterLast() ; //将游标移到数据集最后一行之后。
public void first(); //将游标移到数据集的第一行。
public void last(); //将游标移到数据集的最后一行。
public boolean isAfterLast(); //推断游标是否在最后一行之后。
public boolean isBeforeFirst(); //推断游标是否在第一行之前。
public boolean ifFirst(); //推断游标是否指向数据集的第一行。
public boolean isLast(); //推断游标是否指向数据集的最后一行。
public int getRow(); //取当前游标所指向行的行号,行号从1开始,如果数据集为空,返回0。
public boolean absolute(int row); //将游标移到参数row指定的行号。万一row取负值,即便倒数的行数,absolute(-1)表示移到最后一行,absolute(-2)表示移到倒数第2行。
案例:
@Test
public void TestScrollResultSet(){
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {
conn=JDBCUtils.getConnection();
/*
* conn.createStatement(int type,int concurrency);
* * type:设置结果集的游标滚动方式
* * ResultSet.TYPE_FORWARD_ONLY: 结果集只能向前移动
* * ResultSet.TYPE_SCROLL_INSENSITIVE: 结果集双向移动
* ResultSet.TYPE_SCROLL_SENSITIVE: 象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。
这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中
* * concurrency:结果集的并发类型
* ResultSet.CONCUR_READ_ONLY: 只读模式
* ResultSet.CONCUR_UPDATABLE:指定可以更新 ResultSet
*/
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
String sql="SELECT id,name,email FROM emp";
rs=stmt.executeQuery(sql);//执行查询
rs.next();
System.out.print(rs.getInt(1)+" ");
System.out.print(rs.getString(2)+" ");
System.out.println(rs.getString(3));
//将光标移动到此 ResultSet 对象的上一行。
rs.previous();
System.out.print(rs.getInt(1)+" ");
System.out.print(rs.getString(2)+" ");
System.out.println(rs.getString(3));
//将光标移动到此 ResultSet 对象的第一行
rs.first();
System.out.print(rs.getInt(1)+" ");
System.out.print(rs.getString(2)+" ");
System.out.println(rs.getString(3));
//将光标移动到此 ResultSet 对象的最后一行
rs.last();
System.out.print(rs.getInt(1)+" ");
System.out.print(rs.getString(2)+" ");
System.out.println(rs.getString(3));
//将光标移动到此 ResultSet 对象的开头,正好位于第一行之前。
rs.beforeFirst();
rs.next();
System.out.print(rs.getInt(1)+" ");
System.out.print(rs.getString(2)+" ");
System.out.println(rs.getString(3));
//将光标移动到此 ResultSet 对象的末尾,正好位于最后一行之后。。
rs.afterLast();
rs.previous();
System.out.print(rs.getInt(1)+" ");
System.out.print(rs.getString(2)+" ");
System.out.println(rs.getString(3));
//将光标移动到此 ResultSet 对象的给定行编号。从1开始计算
rs.absolute(1);
System.out.print(rs.getInt(1)+" ");
System.out.print(rs.getString(2)+" ");
System.out.println(rs.getString(3));
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, stmt, rs);
}
}