JAVA基礎知識之JDBC——離線RowSet


離線RowSet

如果直接使用ResultSet, 程序在得到ResultSet記錄之后需要立即使用,否則一旦關閉Connection就不再可用,要解決這種情況要么將ResultSet的結果轉換成JavaBean存儲,要么在Connection關閉之前完成所有操作,不過這些辦法都不太方便。

但是通過離線的RowSet卻能很好地解決這個問題。RowSet可以將ResultSet的結果集封裝成RowSet對象,存儲在內存中進行數據操作,而Connection則可以斷開。直到數據操作完成之后,重新再連接數據庫,進行數據同步即可。下面以CachedRowSet為例演示離線RowSet的用法,

 1 package db;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.IOException;
 6 import java.sql.Connection;
 7 import java.sql.DriverManager;
 8 import java.sql.ResultSet;
 9 import java.sql.SQLException;
10 import java.sql.Statement;
11 import java.util.Properties;
12 
13 import javax.sql.rowset.CachedRowSet;
14 import javax.sql.rowset.RowSetFactory;
15 import javax.sql.rowset.RowSetProvider;
16 
17 public class CachedRowSetTest {
18     private static String driver;
19     private static String url;
20     private static String user;
21     private static String pass;
22     public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException {
23         //用Properties類加載屬性文件
24         Properties prop = new Properties();
25         prop.load(new FileInputStream(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) throws SQLException {
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         return cachedRs;
44     }
45     public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException, SQLException {
46         CachedRowSetTest ct = new CachedRowSetTest();
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    學生名28
 2 26    學生名26    學生名27
 3 25    學生名25    學生名26
 4 24    學生名24    學生名25
 5 23    學生名23    學生名24
 6 22    學生名22    學生名23
 7 21    學生名21    學生名22
 8 20    學生名20    學生名21
 9 19    學生名19    學生名20
10 18    學生名18    學生名19
11 17    學生名17    學生名18
12 16    學生名16    學生名17
13 15    學生名15    學生名16
14 14    學生名14    學生名15
15 13    學生名13    學生名14
16 12    學生名12    學生名13
17 11    學生名11    學生名12
18 10    學生名10    學生名11
19 9    學生名9    學生名10
20 8    學生名8    學生名9
21 7    學生名7    學生名8
22 6    學生名6    學生名7
23 5    學生名5    學生名6
24 4    學生名4    學生名5
25 3    小明    小強
26 2    學生名2    學生名3
27 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 package db;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.IOException;
 6 import java.sql.Connection;
 7 import java.sql.DriverManager;
 8 import java.sql.ResultSet;
 9 import java.sql.SQLException;
10 import java.sql.Statement;
11 import java.util.Properties;
12 
13 import javax.sql.rowset.CachedRowSet;
14 import javax.sql.rowset.RowSetFactory;
15 import javax.sql.rowset.RowSetProvider;
16 
17 public class CachedRowSetPage {
18     private String driver;
19     private String url;
20     private String user;
21     private String pass;
22     public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException {
23         //用Properties類加載屬性文件
24         Properties prop = new Properties();
25         prop.load(new FileInputStream(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, int page)
34             throws SQLException {
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             return cachedRs;
47         }
48     }
49     public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException, SQLException {
50         CachedRowSetPage cp = new CachedRowSetPage();
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    學生名7
2 5    學生名5    學生名6
3 4    學生名4    學生名5

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM