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.FilteredRowSet和JoinRowSet接口支持对行集的轻量级操作,即等同于SQL中的SELECT和JOIN操作,操作的对象是存储在行集中的数据,因此也无需建立数据库连接;
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行集的更多相关文章
- JDBC高级特性(二)事务、并发控制和行集
一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommi ...
- JavaEE JDBC 可滚动和可更新的结果集ResultSet
可滚动和可更新的结果集ResultSet @author ixenos 需求背景 1.对于一个只需要分析数据的程序来说,普通的ResultSet已够用 2.但如果ResultSet用于显示一张表或查询 ...
- com.microsoft.sqlserver.jdbc.SQLServerException: 结果集没有当前行
參考博客com.microsoft.sqlserver.jdbc.SQLServerException: 结果集没有当前行 java获取结果集,if(rs!=null).和while(rs.next( ...
- JAVA基础知识之JDBC——RowSet
RowSet概念 在C#中,提供了一个DataSet,可以把数据库的数据放在内存中进行离线操作(读写),操作完成之后再同步到数据库中去,Java中则提供了类似的功能RowSet. RowSet接口继承 ...
- 将JDBC ResultSet结果集变成List
private List<Map<String, Object>> list = new ArrayList<Map<String,Object>>() ...
- 将JDBC ResultSet结果集转成List
private List<Map<String, Object>> list = new ArrayList<Map<String,Object>>() ...
- JavaEE JDBC 补充注意点
JDBC补充注意点 @author ixenos 1.一个Statement对象可以用于多个不相关的命令和查询,但是一个Statement对象最多只能有一个打开的结果集,如果需要同时执行多个查询同时分 ...
- JavaEE JDBC 核心API
JDBC接口核心的API @author ixenos java.sql.* 和 javax.sql.* |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口 ...
- JDBC的结果集
以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/result-sets.html: SQL语句从数据库查询中获取数据,并将数据返回到结果集中.SELEC ...
随机推荐
- bnu oj 13288 Bi-shoe and Phi-shoe
题目链接: http://www.bnuoj.com/contest/problem_show.php?pid=13288 题目大意: 给出一个n,然后给出n个幸运数([1,m]中不能被m整除的数的数 ...
- [poj2096] Collecting Bugs【概率dp 数学期望】
传送门:http://poj.org/problem?id=2096 题面很长,大意就是说,有n种bug,s种系统,每一个bug只能属于n中bug中的一种,也只能属于s种系统中的一种.一天能找一个bu ...
- 洛谷 P1501 [国家集训队]Tree II
看来这个LCT板子并没有什么问题 #include<cstdio> #include<algorithm> using namespace std; typedef long ...
- java实现九九乘法表
public class Demo { public static void main(String[] args) { for (int i = 1; i < 10; i++) { ...
- 如何隐藏electron窗体的菜单栏
electron中默认带有顶部菜单栏,有时候我们的应用不需要. 再main.js文件中设置 const electron = require('electron') const path = requ ...
- iOS判断输入的字符串是否是纯数字
主要用于判断输入到TextField的内容是不是数字,比如需要输入电话号码的时候. 网上查看了一些资料,一般都是通过协议. 以下内容来自:http://www.2cto.com/kf/201404/2 ...
- iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现 -- 转
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...
- Hadoop 之Pig的安装的与配置之遇到的问题---待解决
1. 前提是hadoop集群已经配置完成并且可以正常启动:以下是我的配置方案: 首先配置vim /etc/hosts 192.168.1.64 xuegod64 192.168.1.65 xuegod ...
- git push代码时的'git did not exit cleanly (exit code 1)'问题解决
在利用git管理本地发布的galleryLeftOrRight插件项目时,按照git的使用方法:先commit→master,再 push,发现提示错误git did not exit cleanly ...
- 表单里的button默认是submit类型
今天很坑爹,周六一大早加班开始码代码,本来想做数据加密测试,于是乎用tp框架搭建了一个应用环境,二话不说,开始码码. 但,今天一大早就栽坑!直到同事喊吃饭还在坑里出不来!吃完饭继续码,最后码的我想哭o ...