📜  Java JDBC 中连接和断开连接的 RowSet 之间的区别

📅  最后修改于: 2022-05-13 01:55:23.248000             🧑  作者: Mango

Java JDBC 中连接和断开连接的 RowSet 之间的区别

RowSet 是 ResultSet 对象的包装器。它可以与数据库连接、断开连接,并且可以序列化。它通过设置属性来维护一个 JavaBean 组件。您可以通过网络传递 RowSet 对象。默认情况下,RowSet 对象是可滚动和可更新的。

此图将让您更多地了解 ResultSet 和 RowSet 类层次结构。找出哪个 RowSet 实现是 Connected 和哪个是 Disconnected 也很有用。可以看到RowSet接口主要有两个实现,连接的JdbcRowSet和断开的CachedRowSet。

RowSet 对象有以下两种类型:

  • 连接的行集
  • 断开的行集

让我们讨论上述两种类型如下:

类型 1:连接的行集

连接的 RowSet 对象使用 JDBC 驱动程序连接到数据库。它建立与数据库的连接,并执行所需的操作。连接一直保持到 RowSet 对象关闭。

类型 2:断开的行集

断开连接的 RowSet 对象仅在从数据库读取和写入数据库时连接到数据库。断开连接的 RowSet 对象在处理数据时不保持与数据库/数据源的连接,因此它独立运行。

断开连接的 RowSet 对象与连接的 RowSet 对象几乎相同,除了它们是:

  • 与连接的 RowSet 对象相比,重量更轻。
  • 可序列化。
  • 能够将数据发送到轻量级客户端,例如手机等。

JDBC 提供了四个表示断开连接的 RowSet 对象的类,如下所列:

  1. 缓存行集
  2. 网络行集
  3. 加入行集
  4. 过滤行集

让我们详细讨论上述每个类,以了解它们的功能如下:

第 1 类:CachedRowSet

CachedRowSet 是非连接行集的基本实现。它连接到数据源,从中读取数据,断开与数据源的连接并处理检索到的数据,重新连接到数据源并写入修改。

第 2 类:WebRowSet:

WebRowSet 扩展了 CachedRowSet。

第 3 类:JoinRowSet

这能够将数据发送到轻量级客户端,例如手机等。

第 4 类:FilteredRowSet:

这使您能够减少 RowSet 中可见的行数。

现在进入古怪的概念,以找出 Connected 和 Disconnected RowSet 之间的区别

正如我们上面已经提到的,连接和断开连接的 RowSet 之间的主要区别在于,前者始终保持数据库连接,而后者则没有。它连接到数据库,获取数据,然后关闭连接。以下是它们之间的更多区别:

1)断开连接的数据库只有在想要读取或写入时才连接到数据库,始终断开与数据库的连接,另一方面,连接的数据库始终保持JDBC连接处于活动状态。

2)只有JDBC 4.1 API 中的JdbcRowSet 是连接的,其余的像CachedRowSet、WebRowSet 都是断开的RowSet 实现。

3) Disconnected RowSet 是可序列化的,这就是为什么适合通过网络发送

此表很好地比较了 JDBC API 中不同 RowSet 实现所支持的功能。

FeaturesJdbcRowSetCacheRowSetWebRowSet
ScrollableNot allowedNot allowedNot allowed
UpdatableNot allowedNot allowedNot allowed
ConnectedNot allowedNot allowedNot allowed
Disconnected Not allowedNot allowed
Serializable Not allowedNot allowed
Generate XML  Not allowed
Consume XML  Not allowed

Java中的行集

实现:我们将使用 RowSet 而不是 ResultSet 接口来检索员工的记录。到目前为止,您可能只看到了返回查询结果的 ResultSet 对象,但是从 JDBC 4.1 API 开始,您可以使用 RowSet 实现的任何实现来查询数据库和检索结果。

  • 在下面的 JDBC 示例中,我们将使用 JdbcRowSet 类。为了创建 JdbcRowSet 的对象,需要一个 RowSetFactory,可以使用 RowSetProvider 的newFactory()方法创建。
  • 拥有 RowSet 对象后,您可以通过调用它们各自的 setProperties() 方法(如setURL()、 setUsername()setPassword())传递配置详细信息,如数据库 URL、用户名和密码。
  • 配置完成后,是时候指定我们的 SQL SELECT 查询了,我们将使用一个名为setCommand()的方法来提供查询。现在您可以通过调用 execute() 方法来执行查询。你有没有注意到一个更干净、更简单的 API?
  • 在查询执行之后,是时候检索数据了,这与您习惯于从 ResultSet 调用各种 getXXX() 方法非常相似。您只需要通过检查 while 循环中的hasNext() 方法并逐行获取数据来遍历 RowSet。

例子

Java
// Java Program to illustrate how to use RowSet,
// RowSetProvider, and RowSetFactory in JDBC
  
// Importing required classes
import java.sql.*;
import javax.sql.rowset.*;
  
// Main class
// RowSetDemo
public class GFG {
  
    // Main driver method
    public static void main(String[] args)
    {
  
        // Setting username and password to access database
        String url
            = "jdbc:mysql://localhost:3306/addressBook";
        String userName = "root";
        String password = "mysql123";
  
        // Try block to check for exceptions
        try {
  
            // Step 1: Create a factory object for rowset
            RowSetFactory rowSetFactory
                = RowSetProvider.newFactory();
  
            // Step 2: Creating a JDBC rowset object from
            // the factory
            JdbcRowSet rowSet
                = rowSetFactory.createJdbcRowSet();
  
            // Step 3: Setting connection properties
            rowSet.setUrl(url);
            rowSet.setUsername(userName);
            rowSet.setPassword(password);
  
            // Step 4: Setting SQL Query to execute
            rowSet.setCommand("SELECT * FROM contact");
  
            // Step 5: Executing an SQL querry
            rowSet.execute();
  
            // Print and display the attributes
            System.out.println(
                "id \tName \tDepartment \tEmail \tSalary");
  
            // Iterating over RowSet object
            // using next() method
            while (rowSet.next()) {
  
                // Print and display all employee
                // attributese
                System.out.println(
                    rowSet.getInt("id") + "\t"
                    + rowSet.getString("name") + "\t"
                    + rowSet.getString("department") + "\t"
                    + rowSet.getString("email") + "\t"
                    + rowSet.getString("salary"));
            }
        }
  
        // Catch block to handle the exceptions
        catch (SQLException sqle) {
  
            // Display the exception along with line number
            // using printStackTrace() method
            sqle.printStackTrace();
        }
    }
}


输出:

Id      Name    Department      Email                   Salary
1       Jack    Sales           jack@bluechip.com       9000
2       Jill    Marketing       jill@bluechip.com       8000
3       Tom     Accounts        tom@bluechip.com        7000