JDBC - RowSet



RowSet 是一个接口,类似于 ResultSet,位于 java.sql 下的 javax.sql.rowset 包中。它继承自 ResultSet,并且比 ResultSet 具有更多功能。RowSet 可以是可滚动的和可更新的。某些数据库管理系统不支持 ResultSet 的可滚动性和可更新性。在这种情况下,必须使用 RowSet。此外,RowSet 具有 Java Bean 功能。它们具有属性。可以使用 setter 和 getter 方法设置或检索属性。RowSet 使用事件模型,在发生某些事件时会传播事件。

事件分为以下三种类型:

  • 更新、插入或删除一行

  • 光标移动

  • RowSet 内容发生更改

RowSet 接口类型

RowSet 接口有 5 个主要的子接口。

  • JdbcRowSet

  • CachedRowSet

  • WebRowSet

  • JoinRowSet

  • FilteredRowSet

示例:使用 RowSet 执行基本的 CRUD 操作

在这个例子中,我们有三个静态字符串包含数据库连接 URL、用户名和密码。现在使用 RowSetProvider.newFactory().createJdbcRowSet() 方法,我们准备了一个 JdbcRowSet 对象作为 rowSet。在 rowSet 中,我们设置了 URL、用户名、密码和一个 SQL 命令,用于从 employees 表中获取员工详细信息。使用 rowSet.execute(),查询被执行,记录存储在 rowSet 实例中。

使用 rowSet.next() 方法,我们检查是否还有更多记录,然后使用 getInt() 和 getString() 方法获取所需的值,并在 while 循环中打印它们以打印所有员工。

使用 rowSet.absolute(3) 方法,我们移动到第三条记录,并使用 rowSet.updateInt() 将年龄更新为 30。接下来,使用 rowSet.updateRow() 更新数据库中的完整记录。现在使用 rowSet.last() 方法,我们移动到最后一条记录,并使用 rowSet.deleteRow() 方法删除该记录。现在为了验证更改,我们设置命令来选择员工的详细信息并执行它。最后,我们再次打印所有员工的记录。

将以下示例复制并粘贴到 RowSetExample.java 中,编译并运行如下:

import javax.sql.rowset.*;
import java.sql.*;

// This class demonstrates use of basic functionality of rowsets
public class RowSetExample {

   static final String DB_URL = "jdbc:mysql://127.0.0.1/TUTORIALSPOINT";
   static final String USER = "root";
   static final String PASS = "guest123";

   public static void main(String args[])throws SQLException {
      JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();  
      rowSet.setUrl(DB_URL);  
      rowSet.setUsername(USER);  
      rowSet.setPassword(PASS);  
      rowSet.setCommand("select id, age, first, last from employees");  
      rowSet.execute();  

      while (rowSet.next()) {  
         System.out.print("Id: " + rowSet.getInt(“id”));
         System.out.print(" Age: " + rowSet.getInt("age"));
         System.out.print(" First: " + rowSet.getString("first"));
         System.out.println(" Last: " + rowSet.getString("last"));
      }  

      System.out.println("---------------------------------------");
      // Position the cursor to the 3rd row
      rowSet.absolute(3);
      rowSet.updateInt("age",20 );
      rowSet.updateRow();

      //position the cursor to the last row
      rowSet.last();
      rowSet.deleteRow();

      // After updating the 3rd row and deleting the last row, doing a select to view updated records.
      rowSet.setCommand("select id, age, first, last from employees");  
      rowSet.execute();

      while (rowSet.next()) {  
         System.out.print("Id: " + rowSet.getInt(“id”));
         System.out.print(" Age: " + rowSet.getInt("age"));
         System.out.print(" First: " + rowSet.getString("first"));
         System.out.println(" Last: " + rowSet.getString("last"));
      }  
   }
}

输出

现在让我们编译上面的示例,如下所示:

C:\>javac RowSetExample.java
C:\>

运行 RowSetExample 时,会产生以下结果:

C:\>java RowSetExample
Id: 1 Age: 18 First: Zara Last: Ali
Id: 2 Age: 25 First: Mahnaz Last: Fatma
Id: 3 Age: 30 First: Zaid Last: Khan
Id: 4 Age: 28 First: Sumit Last: Mittal
Id: 7 Age: 20 First: Rita Last: Tez
Id: 8 Age: 20 First: Sita Last: Singh
Id: 21 Age: 35 First: Jeevan Last: Rao
Id: 22 Age: 40 First: Aditya Last: Chaube
Id: 25 Age: 35 First: Jeevan Last: Rao
Id: 26 Age: 35 First: Aditya Last: Chaube
Id: 34 Age: 45 First: Ahmed Last: Ali
Id: 35 Age: 50 First: Raksha Last: Agarwal
Id: 36 Age: 50 First: Sankalp Last: Hawladar
Id: 37 Age: 50 First: Anand Last: Roy
---------------------------------------
Id: 1 Age: 18 First: Zara Last: Ali
Id: 2 Age: 25 First: Mahnaz Last: Fatma
Id: 3 Age: 20 First: Zaid Last: Khan
Id: 4 Age: 28 First: Sumit Last: Mittal
Id: 7 Age: 20 First: Rita Last: Tez
Id: 8 Age: 20 First: Sita Last: Singh
Id: 21 Age: 35 First: Jeevan Last: Rao
Id: 22 Age: 40 First: Aditya Last: Chaube
Id: 25 Age: 35 First: Jeevan Last: Rao
Id: 26 Age: 35 First: Aditya Last: Chaube
Id: 34 Age: 45 First: Ahmed Last: Ali
Id: 35 Age: 50 First: Raksha Last: Agarwal
Id: 36 Age: 50 First: Sankalp Last: Hawladar

C:\>

RowSet 操作中的事件处理

有一个接口 RowSetListener 需要通过 addRowSetListener 添加到 JdbcRowSet。RowSetListener 中有三个需要实现的方法。

public void cursorMoved(RowSetEvent event)

此方法在 RowSet 光标移动时触发。

public void rowChanged(RowSetEvent event)

当 RowSet 中的一行发生更改时,此方法被触发。

public void rowSetChanged(RowSetEvent event); 

当 RowSet 的整个内容发生更改时,此方法被触发。

示例:使用监听器处理 RowSet 操作中的事件

在这个例子中,我们有三个静态字符串包含数据库连接 URL、用户名和密码。现在使用 RowSetProvider.newFactory().createJdbcRowSet() 方法,我们准备了一个 JdbcRowSet 对象作为 rowSet。在 rowSet 中,我们设置了 URL、用户名、密码和一个 SQL 命令,用于从 employees 表中获取员工详细信息。使用 rowSet.execute(),查询被执行,记录存储在 rowSet 实例中。

我们定义了一个 RowSetListener 作为 CustomListener,它监听各种 RowSetEvent。使用 rowSet.addRowSetListener(),此监听器注册到 rowSet。

使用 rowSet.next() 方法,我们检查是否还有更多记录,然后使用 getInt() 和 getString() 方法获取所需的值,并在 while 循环中打印它们以打印所有员工。

使用 rowSet.absolute(3) 方法,我们移动到第三条记录,并使用 rowSet.updateInt() 将年龄更新为 30。接下来,使用 rowSet.updateRow() 更新数据库中的完整记录。现在当程序运行时,CustomListener 对象监听各种事件,并相应地在控制台上打印结果。

将以下示例复制并粘贴到 RowSetExample.java 中,编译并运行如下:

import javax.sql.rowset.*;
import javax.sql.*;
import java.sql.*;

// This class demonsrates use of RowSetEvent and event-handling in RowSet
public class RowSetExample {

   static final String DB_URL = "jdbc:mysql://127.0.0.1/TUTORIALSPOINT";
   static final String USER = "root";
   static final String PASS = "guest123";

   public static void main(String args[]) throws SQLException {
      JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();  
      rowSet.setUrl(DB_URL);  
      rowSet.setUsername(USER);  
      rowSet.setPassword(PASS);
      rowSet.setCommand("select id, age, first, last from employees");  
      rowSet.execute();
      rowSet.addRowSetListener(new CustomListener());  

      while (rowSet.next()) {  
         // Generating cursor Moved event        
         System.out.print("Id: " + rowSet.getInt(1));
         System.out.print(" Age: " + rowSet.getInt("age"));
         System.out.print(" First: " + rowSet.getString("first"));       
      } 
      System.out.println(" Last: " + rowSet.getString("last"));
      System.out.println("-------------------------------------------------");
      rowSet.absolute(3);
      rowSet.updateInt("age",30 );
      //Generating row changed event
      rowSet.updateRow();
   }  
}  

class CustomListener implements RowSetListener {  
   public void cursorMoved(RowSetEvent evt) {  
      System.out.println("Cursor Moved...");  
   }  
   public void rowChanged(RowSetEvent evt) {  
      System.out.println("Row Changed...");  
   }  
   public void rowSetChanged(RowSetEvent evt){
      System.out.println("RowSet changed..");
   }
}  

输出

现在让我们编译上面的示例,如下所示:

C:\>javac RowSetExample.java
C:\>

运行 RowSetExample 时,会产生以下结果:

Cursor Moved...
Id: 1 Age: 18 First: Zara Last: Ali
Cursor Moved...
Id: 2 Age: 25 First: Mahnaz Last: Fatma
Cursor Moved...
Id: 3 Age: 20 First: Zaid Last: Khan
Cursor Moved...
Id: 4 Age: 28 First: Sumit Last: Mittal
Cursor Moved...
Id: 7 Age: 20 First: Rita Last: Tez
Cursor Moved...
Id: 8 Age: 20 First: Sita Last: Singh
Cursor Moved...
Id: 21 Age: 35 First: Jeevan Last: Rao
Cursor Moved...
Id: 22 Age: 40 First: Aditya Last: Chaube
Cursor Moved...
Id: 25 Age: 35 First: Jeevan Last: Rao
Cursor Moved...
Id: 26 Age: 35 First: Aditya Last: Chaube
Cursor Moved...
Id: 34 Age: 45 First: Ahmed Last: Ali
Cursor Moved...
Id: 35 Age: 50 First: Raksha Last: Agarwal
Cursor Moved...
Id: 36 Age: 50 First: Sankalp Last: Hawladar
Cursor Moved...
-------------------------------------------------
Cursor Moved...
Row Changed...

CachedRowSet

CachedRowSet 将数据保存在缓存到内存中的行中。下面的示例显示了如何在 CachedRowSet 上使用 setPageSize。页面大小是每页显示的行数,例如,在 GUI 上。

CachedRowSet 是一个断开连接的 RowSet。这意味着它在更新或从数据库检索时获取数据库连接。其他时间,数据库连接断开。

示例:使用 CacheRowSet 操作

在这个例子中,使用 RowSetProvider.newFactory().createCachedRowSet() 方法,我们准备了一个 CachedRowSet 对象作为 rowSet。在 rowSet 中,我们设置了 URL、用户名、密码和一个 SQL 命令,用于从 employees 表中获取员工详细信息。使用 setPageSize(),我们将 CachedRowSet 对象 rowSet 的页面大小设置为 2 条记录。使用 rowSet.execute(),查询被执行,记录存储在 rowSet 实例中。

使用 rowSet.nextPage() 方法,我们检查下一页中是否存在更多记录并打印页码。现在使用 rowSet.next(),我们检查页面中可用的记录,并使用 getInt() 和 getString() 方法获取所需的值,并在 while 循环中打印它们以按页打印所有员工。

将以下示例复制并粘贴到 RowSetExample.java 中,编译并运行如下:

import java.sql.Date;
import java.sql.DriverManager;
import java.sql.Time;
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;

// This class demonstrates use of CachedRowSet
public class RowSetExample {
   public static void main(String args[]) throws Exception {
      RowSetFactory factory = RowSetProvider.newFactory();
      CachedRowSet rowSet = factory.createCachedRowSet();
      //Setting the URL
      String mysqlUrl = "jdbc:mysql://127.0.0.1/TUTORIALSPOINT";
      rowSet.setUrl(mysqlUrl);
      //Setting the user name
      rowSet.setUsername("guest");
      //Setting the password
      rowSet.setPassword("guest123");
      //Setting the query/command
      rowSet.setCommand("select * from employees");
      rowSet.setPageSize(2);
      rowSet.execute();   
      System.out.println("Contents of the row set");
      int i = 1;
      while(rowSet.nextPage()) {
         System.out.println(" Page No: " + i);
         System.out.println("-------------------------------------");
         while(rowSet.next()){
            System.out.print("ID : "+rowSet.getInt("id")+", ");
            System.out.print("Age : "+rowSet.getInt("age")+", ");
            System.out.print("First : "+rowSet.getString("first")+", ");
            System.out.println("Last : "+rowSet.getString("last")+", ");
         }
         System.out.println("------------------------------------- End of page");
         i++;
      }
   }
}

输出

现在让我们编译上面的示例,如下所示:

C:\>javac RowSetExample.java
C:\>

运行 RowSetExample 时,会产生以下结果:

Contents of the row set
 Page No: 1
-------------------------------------
ID : 3, Age : 20, First : Zaid, Last : Khan, 
ID : 4, Age : 28, First : Sumit, Last : Mittal, 
------------------------------------- End of page
 Page No: 2
-------------------------------------
ID : 7, Age : 20, First : Rita, Last : Tez, 
ID : 8, Age : 20, First : Sita, Last : Singh, 
------------------------------------- End of page
 Page No: 3
-------------------------------------
ID : 21, Age : 35, First : Jeevan, Last : Rao, 
ID : 22, Age : 40, First : Aditya, Last : Chaube, 
------------------------------------- End of page
 Page No: 4
-------------------------------------
ID : 25, Age : 35, First : Jeevan, Last : Rao, 
ID : 26, Age : 35, First : Aditya, Last : Chaube, 
------------------------------------- End of page
 Page No: 5
-------------------------------------
ID : 34, Age : 45, First : Ahmed, Last : Ali, 
ID : 35, Age : 50, First : Raksha, Last : Agarwal, 
------------------------------------- End of page
广告