6.1 Giới thiệu về RowSet

Như bạn đã biết, tiêu chuẩn JDBC đã gần 20 năm tuổi và hơi lỗi thời. Các loại mới và các lớp mới đang dần được thêm vào nó, nhưng điều này không thể được thực hiện một cách đẹp mắt ở mọi nơi. Và một trong những nơi đó là ResultSet .

Cơ sở dữ liệu có thể được thực hiện hiệu quả hơn, nhưng giao diện ResultSet không phù hợp. Ngoài ra, chúng tôi không tạo các đối tượng của nó một cách rõ ràng ở bất kỳ đâu, chúng được trả lại cho chúng tôi bởi tệp executeQuery().

Những người tạo ra JDBC đã không suy nghĩ lâu và tạo ra một cơ chế hoàn toàn song song với mọi thứ trước đây. Và nó được gọi là RowSet .

Dưới đây là những lợi ích chính của nó:

  • RowSet mở rộng giao diện của ResultSet, vì vậy các chức năng của nó mạnh hơn các chức năng của ResultSet.
  • RowSet điều hướng linh hoạt hơn thông qua dữ liệu bảng và có thể cuộn qua lại.
  • RowSet duy trì dữ liệu được lưu trong bộ nhớ cache có thể được sử dụng ngay cả sau khi đóng kết nối.
  • RowSet hỗ trợ phương thức kết nối mới, bạn có thể kết nối với cơ sở dữ liệu mà không cần kết nối. Nó cũng hỗ trợ đọc nguồn dữ liệu XML.
  • RowSet hỗ trợ bộ lọc dữ liệu.
  • RowSet cũng hỗ trợ các thao tác nối bảng.

Các loại tập hợp:

  • CachedRowSet
  • Đã LọcHàngBộ
  • JdbcHàngBộ
  • Tham giaHàngBộ
  • WebHàngBộ

6.2 Tạo đối tượng RowSet

Có ba cách khác nhau để lấy một đối tượng công việc.

Đầu tiên, nó có thể chứa đầy dữ liệu từ một Tập kết quả thu được theo cách cổ điển.

Ví dụ, chúng ta có thể cache dữ liệu ResultSet bằng cách sử dụng CachedRowSet :


Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
 
RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);		// Use ResultSet to populate

Thứ hai, bạn có thể tạo một đối tượng RowSet hoàn toàn độc lập bằng cách tạo kết nối cơ sở dữ liệu của riêng bạn cho nó:


JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
rowSet.setUrl("jdbc:mysql://localhost:3306/test");
rowSet.setUsername("root");
rowSet.setPassword("secret");
 
rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

Và thứ ba, bạn có thể kết nối RowSet với kết nối hiện có:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
JdbcRowSet rowSet = new JdbcRowSetImpl(con);

rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

6.3 Ví dụ làm việc với RowSet

Ví dụ một: bộ nhớ đệm .

Hãy viết mã trong đó chúng tôi sử dụng CachedRowSet để lưu trữ tất cả dữ liệu và đọc nó từ một kết nối đã đóng:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);	// Use ResultSet to populate

connection.close();		// Close the connection

// Cache data is still available
while(crs.next()) {
  	System.out.println(crs.getString(1)+"\t"+ crs.getString(2)+"\t"+ crs.getString(3));
}

Ví dụ hai: thay đổi hàng qua RowSet :

// Connect to the database
 CachedRowSet crs = rsf.createCachedRowSet();
 crs.setUrl("jdbc:mysql://localhost/test");
 crs.setUsername("root");
 crs.setPassword("root");
 crs.setCommand("SELECT * FROM user");
 crs.execute();

// This type of operation can only change standalone RowSet
// First, move the pointer to an empty (new) string, the current position is remembered
 crs.moveToInsertRow();
 crs.updateString(1, Random.nextInt());
 crs.updateString(2, "Clone" + System.currentTimeMillis());
 crs.updateString(3, "Female");
 crs.insertRow();  // Add the current (new) line to the rest of the lines
 crs.moveToCurrentRow(); // Return a pointer to the line where it was before insertion

 crs.beforeFirst();
 while(crs.next()) {
 	System.out.println(crs.getString(1) + "," + crs.getString(2) + "," + crs.getString(3));
}

// And now we can upload all our changes to the database
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
con.setAutoCommit(false); // Needed for synchronization
crs.acceptChanges(con);// Synchronize data to database

Nếu bạn quan tâm đến cách thức hoạt động của nó, bạn có thể đọc chủ đề trong tài liệu chính thức. Nhiệm vụ của tôi lúc này chỉ đơn giản là cho biết nó là gì.