zoukankan      html  css  js  c++  java
  • 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) ,相对定位方法,参数值可正可负,参数为正,游标从当前位置向下移动指定值,参数为负,游标从当前位置向上移动指定值。

  • 相关阅读:
    设计模式-抽象工厂模式
    设计模式-工厂方法模式
    设计模式-简单工厂模式
    设计模式-代理模式
    Retrofit原理学习
    Google Flutter的学习与使用
    Robolectric结合Android Studio的使用
    Android中app的启动步骤
    汽车系统实现--增加数据和删除数据
    vue--实现跑马灯效果
  • 原文地址:https://www.cnblogs.com/dartagnan/p/2172722.html
Copyright © 2011-2022 走看看