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异常,且不向数据库中写数据;

JavaEE JDBC RowSet行集的更多相关文章

  1. JDBC高级特性(二)事务、并发控制和行集

    一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommi ...

  2. JavaEE JDBC 可滚动和可更新的结果集ResultSet

    可滚动和可更新的结果集ResultSet @author ixenos 需求背景 1.对于一个只需要分析数据的程序来说,普通的ResultSet已够用 2.但如果ResultSet用于显示一张表或查询 ...

  3. com.microsoft.sqlserver.jdbc.SQLServerException: 结果集没有当前行

    參考博客com.microsoft.sqlserver.jdbc.SQLServerException: 结果集没有当前行 java获取结果集,if(rs!=null).和while(rs.next( ...

  4. JAVA基础知识之JDBC——RowSet

    RowSet概念 在C#中,提供了一个DataSet,可以把数据库的数据放在内存中进行离线操作(读写),操作完成之后再同步到数据库中去,Java中则提供了类似的功能RowSet. RowSet接口继承 ...

  5. 将JDBC ResultSet结果集变成List

    private List<Map<String, Object>> list = new ArrayList<Map<String,Object>>() ...

  6. 将JDBC ResultSet结果集转成List

    private List<Map<String, Object>> list = new ArrayList<Map<String,Object>>() ...

  7. JavaEE JDBC 补充注意点

    JDBC补充注意点 @author ixenos 1.一个Statement对象可以用于多个不相关的命令和查询,但是一个Statement对象最多只能有一个打开的结果集,如果需要同时执行多个查询同时分 ...

  8. JavaEE JDBC 核心API

    JDBC接口核心的API @author ixenos java.sql.*   和  javax.sql.* |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口 ...

  9. JDBC的结果集

    以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/result-sets.html: SQL语句从数据库查询中获取数据,并将数据返回到结果集中.SELEC ...

随机推荐

  1. 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers

    题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...

  2. 题解报告:hdu 2087 剪花布条(KMP入门)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面 ...

  3. 1475 建设国家 DP

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1475 这题转化过来就是,给定n个点,每个点都有一个过期时间,一个价值.现 ...

  4. C# KeepAlive的设置

    C# KeepAlive的相关设置 网上有很多相关KeepAlive的内容,终于找到了有关C#的这方面资料,设置了下,有行可靠! TcpListener myListener = new TcpLis ...

  5. 使用 Java 发送邮件

    在我们的应用程序中有时需要给用户发送邮件,例如激活邮件.通知邮件等等.那么如何使用 Java 来给用户发送邮件呢? 使用 java 代码发送邮件 使用工具类发送邮件 使用Spring进行整合发送邮件 ...

  6. Java8特性之Lambda、方法引用以及Stream流

    Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...

  7. Spring------IOC&DI

    一.Spring? Spring兴起:2003年,由Rod Johnson创建.总的来说,Spring Framwork从它诞生至今都一直为人所称道,它的伟大之处自此可见一斑. 核心:IOC& ...

  8. Android EventBus3.0详解

    修改日志 -- 添加索引部分得细节,添加kotlin的支持方式 https://www.jianshu.com/p/31e3528ca7e5

  9. 从单机到2000万 QPS 并发的 Redis 高性能缓存实践之路

    1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能.本文作者陈鹏是该系统的负责人,本次文 ...

  10. 【C++】异常简述(三):补充之如何看待C++异常

    C++异常的使用,我相信在上文总结的已经比较完整了,本文主要对C++异常这块进行额外的补充. 即使C++将异常纳入标准已经很多年了,但是直到现在都能看到很多坚持不显式使用异常.(包括本人在内,在写的代 ...