JDBC可滚动的结果集(scrollresultset)

2012/04/13 1943点热度 0人点赞 0条评论

我们在读取数据库的时候,在读取取到的值的时候,可能要前后挪动指针,例如我们先计算有多少条消息,这时我们就必需把指针移到最后再来计算,然后再把指针移到最前面,逐条读取,有时我们只需逐条读取就能够了。只需要读取的时候,为了不摧毁数据,我们以只读形式读取,有时我们必需往数据库里添加数据,这时我们将模式设置成可更新数据库的形式。

常用方法:

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);
    }
}

yxkong

这个人很懒,什么都没留下

文章评论