离线RowSet
如果直接使用ResultSet, 程序在得到ResultSet记录之后需要立即使用,否则一旦关闭Connection就不再可用,要解决这种情况要么将ResultSet的结果转换成JavaBean存储,要么在Connection关闭之前完成所有操作,不过这些办法都不太方便。
但是通过离线的RowSet却能很好地解决这个问题。RowSet可以将ResultSet的结果集封装成RowSet对象,存储在内存中进行数据操作,而Connection则可以断开。直到数据操作完成之后,重新再连接数据库,进行数据同步即可。下面以CachedRowSet为例演示离线RowSet的用法,
1 packagedb;2
3 importjava.io.FileInputStream;4 importjava.io.FileNotFoundException;5 importjava.io.IOException;6 importjava.sql.Connection;7 importjava.sql.DriverManager;8 importjava.sql.ResultSet;9 importjava.sql.SQLException;10 importjava.sql.Statement;11 importjava.util.Properties;12
13 importjavax.sql.rowset.CachedRowSet;14 importjavax.sql.rowset.RowSetFactory;15 importjavax.sql.rowset.RowSetProvider;16
17 public classCachedRowSetTest {18 private staticString driver;19 private staticString url;20 private staticString user;21 private staticString pass;22 public void initParam(String paramFile) throwsFileNotFoundException, IOException, ClassNotFoundException {23 //用Properties类加载属性文件
24 Properties prop = newProperties();25 prop.load(newFileInputStream(paramFile));26 driver = prop.getProperty("driver");27 url = prop.getProperty("url");28 user = prop.getProperty("user");29 pass = prop.getProperty("pass");30 Class.forName(driver);31 }32 public CachedRowSet query(String sql) throwsSQLException {33 Connection conn =DriverManager.getConnection(url,user,pass);34 Statement stmt =conn.createStatement();35 ResultSet rs =stmt.executeQuery(sql);36 RowSetFactory factory =RowSetProvider.newFactory();37 CachedRowSet cachedRs =factory.createCachedRowSet();38 //使用ResultSet装填RowSet
39 cachedRs.populate(rs);40 rs.close();41 stmt.close();42 conn.close();43 returncachedRs;44 }45 public static void main(String[] args) throwsFileNotFoundException, ClassNotFoundException, IOException, SQLException {46 CachedRowSetTest ct = newCachedRowSetTest();47 ct.initParam("mysql.ini");48 CachedRowSet rs = ct.query("select * from jdbc_test");49 rs.afterLast();50 while(rs.previous()) {51 System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));52 if (rs.getInt(1) == 3) {53 rs.updateString(3,"小强");54 rs.updateRow();55 }56 }57 //重新后去数据库连接
58 Connection conn =DriverManager.getConnection(url,user,pass);59 conn.setAutoCommit(false);60 rs.acceptChanges(conn);61 }62 }
程序执行结果,
1 27学生名27 学生名282 26学生名26 学生名273 25学生名25 学生名264 24学生名24 学生名255 23学生名23 学生名246 22学生名22 学生名237 21学生名21 学生名228 20学生名20 学生名219 19学生名19 学生名2010 18学生名18 学生名1911 17学生名17 学生名1812 16学生名16 学生名1713 15学生名15 学生名1614 14学生名14 学生名1515 13学生名13 学生名1416 12学生名12 学生名1317 11学生名11 学生名1218 10学生名10 学生名1119 9学生名9 学生名1020 8学生名8 学生名921 7学生名7 学生名822 6学生名6 学生名723 5学生名5 学生名624 4学生名4 学生名525 3小明 小强26 2学生名2 学生名327 1 学生名1 学生名2
View Code
离线RowSet查询分页
所谓分页,就是一次只装载ResultSet的某几条记录,这样可以避免CachedRowSet内存占用过大的问题。
CachedRowSet有如下方法控制分页,
populate(ResultSet rs, int startRow) , 从第startRow行开始装载
setPageSize(int pageSize), 设置每页大小
previousPage(); 在底层ResultSet可用情况下,让CachedRowSet读取上一页记录
nextPage() 在底层ResultSet可用情况下,让CachedRowSet读取下一页记录
下面演示CachedRowSet分页用法,
1 packagedb;2
3 importjava.io.FileInputStream;4 importjava.io.FileNotFoundException;5 importjava.io.IOException;6 importjava.sql.Connection;7 importjava.sql.DriverManager;8 importjava.sql.ResultSet;9 importjava.sql.SQLException;10 importjava.sql.Statement;11 importjava.util.Properties;12
13 importjavax.sql.rowset.CachedRowSet;14 importjavax.sql.rowset.RowSetFactory;15 importjavax.sql.rowset.RowSetProvider;16
17 public classCachedRowSetPage {18 privateString driver;19 privateString url;20 privateString user;21 privateString pass;22 public void initParam(String paramFile) throwsFileNotFoundException, IOException, ClassNotFoundException {23 //用Properties类加载属性文件
24 Properties prop = newProperties();25 prop.load(newFileInputStream(paramFile));26 driver = prop.getProperty("driver");27 url = prop.getProperty("url");28 user = prop.getProperty("user");29 pass = prop.getProperty("pass");30 Class.forName(driver);31 }32
33 public CachedRowSet query(String sql, int pageSize, intpage)34 throwsSQLException {35 try(36 Connection conn =DriverManager.getConnection(url, user, pass);37 Statement stmt =conn.createStatement();38 ResultSet rs =stmt.executeQuery(sql)39 ) {40 RowSetFactory factory =RowSetProvider.newFactory();41 CachedRowSet cachedRs =factory.createCachedRowSet();42 //设置pagesize
43 cachedRs.setPageSize(pageSize);44 //使用ResultSet装填RowSet, 设置从第几条记录开始
45 cachedRs.populate(rs, (page - 1) * pageSize + 1);46 returncachedRs;47 }48 }49 public static void main(String[] args) throwsFileNotFoundException, ClassNotFoundException, IOException, SQLException {50 CachedRowSetPage cp = newCachedRowSetPage();51 cp.initParam("mysql.ini");52 //设置每页显示3条记录, 读取第2页的记录
53 CachedRowSet rs = cp.query("select * from jdbc_test", 3, 2);54 rs.afterLast();55 while(rs.previous()) {56 System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));57 }58 }59 }
执行结果,只显示了第2页的数据
1 6学生名6 学生名72 5学生名5 学生名63 4 学生名4 学生名5