zoukankan      html  css  js  c++  java
  • JavaEE JDBC RowSet行集

    RowSet行集

    @author ixenos

    应用背景


    1.基于结果集的缺点:在与用户的整个交互过程中,必须始终与数据库保持连接

      后果:当用户长时间离开时,数据库连接长时间被占用,而这属于稀缺资源;

      解决:使用行集RowSet,RowSet继承了ResultSet接口,却无需始终保持与数据库的连接~ 

    2.结果集不便于移动,因为数据结构复杂,且依赖于连接

      解决:使用行集RowSet,RowSet适用于将查询结果移动到复杂应用的其他层,或者其他设备当中

    3.因为RowSet继承了ResultSet接口,所以ResultSet中的方法RowSet都能用,RowSet是对ResultSet离线化、移动化的增强;

    构建行集


    以下是javax.sql.rowset包提供的接口,这些接口扩展了行集RowSet接口:

    1.CachedRowSet:允许在断开连接的状态下执行相关的操作

    2.WebRowSet:代表了一个被缓存的行集,且该行集可以保存为XML文件,该XML文件可以移动到Web应用的其他层中,只要在该层中使用WebRowSet对象重新打开该文件即可;

    3.FilteredRowSetJoinRowSet接口支持对行集的轻量级操作,即等同于SQL中的SELECTJOIN操作,操作的对象是存储在行集中的数据,因此也无需建立数据库连接;

    4.JdbcRowSet是ResultSet接口的一个瘦包装器,他从RowSet接口中继承了都有用的get和set方法,从而将一个结果集转换成一个Bean

    JavaSE7获取行集的标准方式

    RowSetFactory factory = RowSetProvider.newFactory();
    
    CacahedRowSet crs = factory.createCacheRowSet();
    
    
    //如果有具体实现类,也可使用下面的方式
    CachedRowSet crs = new com.sun.rowset.CachedRowSetImpl();
    

      

    CachedRowSet 被缓存的行集


    1.一个被缓存的行集包含了一个结果集中所有的数据

    2.CachedRowSet是ResultSet接口的子接口,因此可以像使用结果集一样来使用被缓存的行集

    3.优点:断开数据库连接后仍然可以使用行集

    4.使用CachedRowSet的流程

    第一种:使用结果集来填充行集

      1)打开数据库连接

      2)执行查询操作

      3)将查询结果(ResultSet)放入被缓存的行集(CachedRowSet)

      4)关闭数据库连接

    ResultSet result = ...;
    //创建CachedRowSet对象
    CachedRowSet crs = new com.sun.rowset.CachedRowSetImpl();
    //将ResultSet放入CachedRowSet中
    crs.populate(result);
    //此时就可以关闭数据库连接了
    conn.close();
    

      注意:如果使用结果集来填充行集,那么行集是不知道原始表的名字的,这时行集需要调用setTable来设置表名称

    第二种:自力更生

      让CachedRowSet对象自动创建一个数据库连接

      1)首先,设置数据库参数

    CachedRowSet crs = .......;
    //设置数据库url
    crs.setURL("jdbc:mysql://localhost:3306/company");
    //设置用户名和密码
    crs.setUsername("root");
    crs.setPassword("rootpwd");
    

      2)设置查询语句和所有参数

    //不通过Statement,而是自己手把手来查询,估计内部封装了preparedStatement
    crs.setCommand("SELECT * FROM Books WHERE PUBLISHER = ?");
    crs.setString(1, publisherName);
    

      3)将查询结果填充到行集

    crs.execute();
    

        crs.execute这个方法调用将会

          1.建立数据库连接;

          2.执行查询操作;

          3.填充行集;

          4.最后自动断开连接!

      4)如果查询结果很大,鉴于我们使用行集的目的(与用户交互),我们肯定不希望全部放入行集中,因为用户只是想浏览其中几行而已

        此时,我们可以指定每一页的尺寸:

    CachedRowSet crs = ...;
    crs.setCommand(command);
    //设置每次获取20行
    crs.setPageSize(20);
    ...
    crs.execute();
    

        要获取下一批数据,可以调用 crs.nextPage();

    5.可以使用与结果集中相同的方法来查看和修改行集中的数据

    (1)如果修改了行集中的内容,调用以下方法将修改写到数据库中:

    crs.acceptChanges(Connection con)
    
    //如果已在行集中设置了连接数据库需要的信息 url、name、pwd,那么可以直接调用下面的
    crs.acceptChanges()
    

     

    (2)并非所有结果集都是可更新的,行集亦如是。

      如果一个行集包含的是复杂查询的查询结果,我们就无法把修改写到数据库中;不过如果行集上的数据都来自同一张表,那就保证可以

    6.同步问题

      在填充了行集之后,如果数据库中的数据发生了改变,将造成数据不一致;

      此时,我们可以检查行集中的原始值(修改前的值)与数据库中的当前值是否一致,

        一致时,我们才同意修改(比如让修改后的值覆盖数据库中的值);

        不一致时,抛出SynProviderException异常,且不向数据库中写数据;

  • 相关阅读:
    各种HTTP错误消息含义
    fastjson生成和解析json数据
    javascript性能优化
    js正则表达式test方法、exec方法与字符串search方法区别
    JavaScript中字符串的match与replace方法
    js 字符串indexof与search方法的区别
    JavaScript indexof方法
    JavaScript数组方法说明
    setTimeout模拟setInterval调用
    javascript forEach方法与jQuery each区别
  • 原文地址:https://www.cnblogs.com/ixenos/p/6297357.html
Copyright © 2011-2022 走看看