离线RowSet

如果直接使用ResultSet, 程序在得到ResultSet记录之后需要立即使用,否则一旦关闭Connection就不再可用,要解决这种情况要么将ResultSet的结果转换成JavaBean存储,要么在Connection关闭之前完成所有操作,不过这些办法都不太方便。

但是通过离线的RowSet却能很好地解决这个问题。RowSet可以将ResultSet的结果集封装成RowSet对象,存储在内存中进行数据操作,而Connection则可以断开。直到数据操作完成之后,重新再连接数据库,进行数据同步即可。下面以CachedRowSet为例演示离线RowSet的用法,

 package db;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider; public class CachedRowSetTest {
private static String driver;
private static String url;
private static String user;
private static String pass;
public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException {
//用Properties类加载属性文件
Properties prop = new Properties();
prop.load(new FileInputStream(paramFile));
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
pass = prop.getProperty("pass");
Class.forName(driver);
}
public CachedRowSet query(String sql) throws SQLException {
Connection conn = DriverManager.getConnection(url,user,pass);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet cachedRs = factory.createCachedRowSet();
//使用ResultSet装填RowSet
cachedRs.populate(rs);
rs.close();
stmt.close();
conn.close();
return cachedRs;
}
public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException, SQLException {
CachedRowSetTest ct = new CachedRowSetTest();
ct.initParam("mysql.ini");
CachedRowSet rs = ct.query("select * from jdbc_test");
rs.afterLast();
while (rs.previous()) {
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
if (rs.getInt(1) == 3) {
rs.updateString(3,"小强");
rs.updateRow();
}
}
//重新后去数据库连接
Connection conn = DriverManager.getConnection(url,user,pass);
conn.setAutoCommit(false);
rs.acceptChanges(conn);
}
}

程序执行结果,

 27    学生名27    学生名28
26 学生名26 学生名27
25 学生名25 学生名26
24 学生名24 学生名25
23 学生名23 学生名24
22 学生名22 学生名23
21 学生名21 学生名22
20 学生名20 学生名21
19 学生名19 学生名20
18 学生名18 学生名19
17 学生名17 学生名18
16 学生名16 学生名17
15 学生名15 学生名16
14 学生名14 学生名15
13 学生名13 学生名14
12 学生名12 学生名13
11 学生名11 学生名12
10 学生名10 学生名11
9 学生名9 学生名10
8 学生名8 学生名9
7 学生名7 学生名8
6 学生名6 学生名7
5 学生名5 学生名6
4 学生名4 学生名5
3 小明 小强
2 学生名2 学生名3
1 学生名1 学生名2

离线RowSet查询分页

所谓分页,就是一次只装载ResultSet的某几条记录,这样可以避免CachedRowSet内存占用过大的问题。

CachedRowSet有如下方法控制分页,

populate(ResultSet rs, int startRow) , 从第startRow行开始装载

setPageSize(int pageSize), 设置每页大小

previousPage(); 在底层ResultSet可用情况下,让CachedRowSet读取上一页记录

nextPage() 在底层ResultSet可用情况下,让CachedRowSet读取下一页记录

下面演示CachedRowSet分页用法,

 package db;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider; public class CachedRowSetPage {
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException {
//用Properties类加载属性文件
Properties prop = new Properties();
prop.load(new FileInputStream(paramFile));
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
pass = prop.getProperty("pass");
Class.forName(driver);
} public CachedRowSet query(String sql, int pageSize, int page)
throws SQLException {
try (
Connection conn = DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)
) {
RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet cachedRs = factory.createCachedRowSet();
// 设置pagesize
cachedRs.setPageSize(pageSize);
// 使用ResultSet装填RowSet, 设置从第几条记录开始
cachedRs.populate(rs, (page - 1) * pageSize + 1);
return cachedRs;
}
}
public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException, SQLException {
CachedRowSetPage cp = new CachedRowSetPage();
cp.initParam("mysql.ini");
//设置每页显示3条记录, 读取第2页的记录
CachedRowSet rs = cp.query("select * from jdbc_test", 3, 2);
rs.afterLast();
while (rs.previous()) {
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
}
}
}

执行结果,只显示了第2页的数据

 6    学生名6    学生名7
5 学生名5 学生名6
4 学生名4 学生名5

JAVA基础知识之JDBC——离线RowSet的更多相关文章

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

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

  2. JAVA基础知识之JDBC——JDBC事务处理及批量更新

    JDBC事务 JDBC的事务由Connection提供,默认是打开的. 要开启事务,则要关闭自动提交, conn.setAutoCommit(false); 提交事务使用 conn.commit(); ...

  3. JAVA基础知识之JDBC——编程步骤及执行SQL

    JDBC编程步骤 下面以mysql数据库为例, 1.加载驱动 首先需要下载数据库的驱动jar文件,并且在eclipse包中加入到class path中去, 例如mysql的驱动文件 mysql-con ...

  4. JAVA基础知识之JDBC——JDBC数据库连接池

    JDBC数据库连接池 数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接, ...

  5. JAVA基础知识之JDBC——使用ResultSetMetaData分析结果集

    通过ResultSetMetaData可以对ResultSet进行分析,获取ResultSet里包含了哪些数据列,以及每个列的数据类型. ResultSet中包含了一个getMetaData()方法, ...

  6. JAVA基础知识之JDBC——ResultSet的滚动和更新(statement的额外参数)

    ResultSet不仅可以内存中的一张二维表一样保存statement执行SQL的结果集,还能通过结果集修改DB的数据.ResultSetMetaData则可以用来获得ResultSet对象的相关信息 ...

  7. java基础知识-笔记整理

    1.查看已安装jdk文件路径 CMD输入java -verbose.   2.java学习提升路线 java学习视屏地址: http://www.icoolxue.com/album/show/38 ...

  8. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  9. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

随机推荐

  1. 面试之Java多线程

    Java多线程1.什么是多线程2.为什么需要多线程  有什么优点和缺点3.怎么运行 一.多线程是在软件或硬件上并发执行的技术共享数据空间,内存资源和CPU二.优点:把长时间运行的程序任务放到后台处理, ...

  2. java项目开发的一些准备工作

    做项目有一段时间了,每次接手一个新项目都要在开发前做些准备工作,方便开发. 有些东西在配置的时候经常会忘记,所有整理一份,方便以后查阅! 1.安装JDK及搭建环境,安装tomcat及搭建环境,这些一般 ...

  3. 栈的C++实现(指针)——创建-push-pop-top-清空栈-处理栈

    今天学习了栈的C++实现,跟单链表很像: push相当于单链表在第一个位置插入元素: pop相当于单链表在第一个位置删除元素: 1.空栈检查 int stack::isEmpty(Stack *S) ...

  4. 使用ImageCreate()创建一个代表空白图像的变量

    在建立图像创建环境之前,还需要做一些准备工作.首先,安装t1lib接着安装jpeg-6b,然后再安装GD库文件.在安装时一定要按这里给定的顺序进行安装,因为在编译GD入库时会用到jpeg-6b,如果没 ...

  5. 一个简单驱动的makefile

    KVERS = $(shell uname -r) #Kernel modulesobj-m += hello.o build: kernel_modules kernel_modules: make ...

  6. 利用.htaccess实现伪静态方法

    首先配置服务器启动重写模块打开 Apache 的配置文件 httpd.conf .将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉.保存后重启 ...

  7. Android课程---Activity的创建

    一.为了创建一个新的Activity,你需要继承Activity类,定义UI,实现功能.新的Activity的最基本的框架代码如下所示: package com.paad.myapplication; ...

  8. 【iCore3 双核心板_FPGA】例程十三:FSMC总线通信实验——复用地址模式

    实验指导书及代码包下载: http://pan.baidu.com/s/1nuYpI8x iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  9. Educational Codeforces Round 16 A B C E

    做题太久也有点累了..难题不愿做 水题不愿敲..床上一躺一下午..离下一场div2还有点时间 正好有edu的不计分场 就做了一下玩玩了 D是个数学题 F是个AC自动机 都没看明白 留待以后补 A 给出 ...

  10. EntityFramework SQLiteCodeFirst 自动创建数据库 关闭级联删除

    外键的级联删除: 如A表中有主键idA, B表中设置外键(ForeignKey)为A表中的主键idA, 当A表中的记录被删除时, B表中所有引用此条记录的记录(即所有外键为idA的记录)将自动被删除 ...