我们在读取数据库的时候,在读取取到的值的时候,可能要前后挪动指针,例如我们先计算有多少条消息,这时我们就必需把指针移到最后再来计算,然后再把指针移到最前面,逐条读取,有时我们只需逐条读取就能够了。只需要读取的时候,为了不摧毁数据,我们以只读形式读取,有时我们必需往数据库里添加数据,这时我们将模式设置成可更新数据库的形式。
常用方法:
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); } }
文章评论