- JDBC 教程
- JDBC - 首页
- JDBC - 简介
- JDBC - SQL 语法
- JDBC - 环境配置
- JDBC - 示例代码
- JDBC - 驱动程序类型
- JDBC - 连接
- JDBC - 语句
- JDBC - 结果集
- JDBC - 数据类型
- JDBC - 事务
- JDBC - 异常处理
- JDBC - 批量处理
- JDBC - 存储过程
- JDBC - 流式数据
- JDBC - RowSet
- JDBC - 数据库复制
- JDBC - ACID 属性
- JDBC - 连接池
- JDBC 示例
- JDBC - 创建数据库
- JDBC - 选择数据库
- JDBC - 删除数据库
- JDBC - 创建表
- JDBC - 删除表
- JDBC - 插入记录
- JDBC - 查询记录
- JDBC - 更新记录
- JDBC - 删除记录
- JDBC - WHERE 子句
- JDBC - LIKE 子句
- JDBC - 数据排序
- JDBC 有用资源
- JDBC - 常见问题解答
- JDBC - 快速指南
- JDBC - 有用资源
- JDBC - 讨论
- 有用资源 - Java 教程
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