Bootstrap

JDBC 如何使用可滚动 可更新结果集

从JDBC 2.0后:

1. ResultSet就可以在结果集上前后移动并且可以跳转到结果集中的任何位置;

2. 支持可更新的结果集,直接在ResultSet里边修改数据,并且同步到数据库中。

这两个新特性都是在创建新会话时指定的,语法如下:

Statement stmt = conn.createStatement(sql, type_SCROLL/type_UPDATEABLE, concurrency);
PreparedStatement pstmt = conn.preeparedStatement(sql, type_SCROLL/type_UPDATEABLE, concurrency);

  

其中:

type_SCROLL类型可以为以下值:

TYPE_FORWARD_ONLY: 结果集不能滚动
TYPE_SCROLL_INSENSITIVE: 结果集可以移动,但是对数据库变化不敏感,数据库查询生成结果集后发生了变化,结果集不发生变化
TYPE_SCROLL_SENSITIVE: 结果集可以移动,但是对数据库变化敏感

  

type_UPDATEABLE类型可以为以下值:

CONCUR_READ_ONLY: 结果集不能用于更新数据库
CONCUR_UPDATEABLE: 结果集可以用于更新数据库

  

示例:

public  ConcurrentLinkedQueue getStockInfoQueue(String table, String stockCode ){   //从数据库中取出股票信息,保存到队列,并返回队列
         ConcurrentLinkedQueue<RTmm> clq = new  ConcurrentLinkedQueue<RTmm>();
         String sql = "select * from " +table + " where s_code = '"  +stockCode+ "'" ;
         String sql2 = "select count(*) from " +table + " where s_code = '"  +stockCode+ "'" ;
         try  {
             Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);  //可滚动结果集
             ResultSet rs2 = stmt.executeQuery(sql2);
             rs2.last();
             System.out.println( "记录数" +rs2.getInt( 1 ));
             int  records = rs2.getInt( 1 );   //得到记录个数
             ResultSet rs = stmt.executeQuery(sql);
             if (records < 60 ){
                 while (rs.next()){
                     String code = rs.getString( 1 );
                     String time = rs.getString( 3 );
                     double  open = rs.getDouble( 4 );
                     double  close = rs.getDouble( 5 );
                     double  low = rs.getDouble( 6 );
                     double  high = rs.getDouble( 7 );
                     // RTmm(String code, String dt, double low, double open, double close, double high)
//                  System.out.println(code+time+open+"  "+close+"  "+high);
                     RTmm rtmm = new   RTmm(code.trim(), time.trim(), low,  open, close, high);
                     clq.add(rtmm);
                 }
             } else {
                 rs.absolute(records - 60 );
                 while (rs.next()){
                     String code = rs.getString( 1 );
                     String time = rs.getString( 3 );
                     double  open = rs.getDouble( 4 );
                     double  close = rs.getDouble( 5 );
                     double  low = rs.getDouble( 6 );
                     double  high = rs.getDouble( 7 );
                     // RTmm(String code, String dt, double low, double open, double close, double high)
//                  System.out.println(code+time+open+"  "+close+"  "+high);
                     RTmm rtmm = new   RTmm(code.trim(), time.trim(), low,  open, close, high);
                     clq.add(rtmm);
                 }
             }
         } catch  (SQLException  e) {
             e.printStackTrace();
         }
         return  clq;
     }

  

滚动特性:

  next(),此方法是使游标向下一条记录移动。

  previous() ,此方法可以使游标上一条记录移动,前提前面还有记录。

  absolute(int row),可以使用此方法跳到指定的记录位置。定位成功返回true,不成功返回false,返回值为false,则游标不会移动。

  afterLast() ,游标跳到最后一条记录之后。

  beforeFirst() ,游标跳到第一条记录之前。(跳到游标初始位)

  first(),游标指向第一条记录。

  last(),游标指向最后一条记录。

  relative(int rows) ,相对定位方法,参数值可正可负,参数为正,游标从当前位置向下移动指定值,参数为负,游标从当前位置向上移动指定值。


;