可卷动结果集ResultSet分页

本文详细介绍了在JDBC2.0中如何使用可滚动的ResultSet。包括不同类型ResultSet的特点、创建方法及可使用的特定方法等。探讨了可滚动ResultSet在实际应用中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

到目前为止,所有的 ResultSet 都已经以连续的方式进行了运 用,从头至尾使用 ResultSet.next() 获取各行。如在语句、 ResultSet 和与数据库互动中介绍的,在本课程自始至终也可以看 到, ResultSet 是通过语句获取的,通常使用 executeQuery 方法。到现在为止,语句的创建都是使用

stmt = con.createStatement();
该方法是 JDBC 1.0 中唯一可用的方法。在 JDBC 2.0 中,存在着允许创建可卷 动和/或可更新的 ResultSet 新方法。
createStatement( 
   int resultSetType, 
   int resultSetConcurrency )
resultSetType 可以是

ResultSet.TYPE_FORWARD_ONLY--这是默认值,和 JDBC 1.0 中的一样:仅转 交移动,列一般地仅能读取一次。在 ResultSet.next() 返回 false 时, ResultSet 数据就不再有效并自动关 闭。

ResultSet.TYPE_SCROLL_INSENSITIVE 允许创建 ResultSet, 其中的光标可以向后、向前和随机移动。这是静态数据:数据库中对当前 ResultSet 中选定的行进行的任何更改都是不可见的。也就是说, ResultSet 对数据修改不敏感。

ResultSet.TYPE_SCROLL_SENSITIVE 允许创建 ResultSet,其 中的光标可以向后、向前和随机移动。这提供了数据的动态视图:数据库中对当 前 ResultSet 中选定的行进行的任何更改都是可见的。也就是说, ResultSet 对数据修改很敏感。

resultSetConcurrency 可以是

ResultSet.CONCUR_READ_ONLY - 这是默认值,和 JDBC 1.0中的一样:

ResultSet.CONCUR_UPDATABLE 允许通过新的 ResultSet 方法 和定位性能对编程数据进行更改。

可更新的 ResultSet 优点、缺点都有,本课程不作深入讨论。 更多的信息,请查看 Java 教程或 JDBC 教程和 参考资料(第二版)联机版本中高级教程的第 3.3 部分。

 

注意,已请求的 ResultSet 类型,即使受到驱动程序的支持, 也可能无法返回。如果出现该情况,驱动程序会在连接时发出 SQLWarning。 另外, DatabaseMetaData.supportsResultSetType() 可用于确定 驱动程序支持的 ResultSet类型, ResultSet.getType() 提供实际返回的 ResultSet 的类型。详情请查看请 求未支持的特性

可卷动的 ResultSet 的获取方式如任何其他的一样,通常都是 通过 Statement.executeQuery() 进行。不过,有了 ResultSet, 就可以使用以下方法:

 

absolute()

afterLast()

beforeFirst()

first()

getRow()

isAfterLast()

isBeforeFirst()

isFirst()

isLast()

last()

moveToCurrentRow()--仅对可更新的 ResultSet 有效。

moveToInsertRow()--仅对可更新的 ResultSet 有效。

previous()

relative()

这些方法的详情请查看 ResultSet

 

用法注释

 

可卷动 ResultSets 的驱动程序性能和但实现级别会变化,有 时很显著。请检查文档。下面是在使用可卷动的 ResultSets 时应 考虑的其他几个因素,但决不是全部。

可卷动的 ResultSet,正如不可卷动的 ResultSet 一样,检索时定位在第一行前。

所有的行检索时,语句才视为完成。这在 ResultSet.next() 检索最后一行时发生。一些驱动程序在 autocommit 开启时将此视为联锁该语句。 结果, ResultSet 会关闭,并在下一个访问尝试时给出 SQLException。 为了可移植性,请将 autocommit 设置为 false。

ResultSet.getRow() 会在某些(甚至全部)位置返回零。这尤 其意味着,使用已赋值的 ResultSet.last()ResultSet.getRow() 序列在数据库中(甚至在同一数据库的驱动程序中)获取的行数不太可靠。

ResultSet.absolute() 在传递零时会给出 SQLException

ResultSet.relative() 不会更改光标的位置。不过,至少一 个供应商会不检查零值而从 ResultSet.absolute() 中调用 ResultSet.relative()。请考虑潜在的(笔者有此教训)结果。

 
### Java ResultSet 分页实现 在处理大型数据时,分页是一种常见的优化技术。通过分页,应用程序可以在每次请求中只加载一部分数据而不是全部数据,从而提高性能和用户体验。 #### 使用 `ResultSet` 和 JDBC 进行分页 为了有效地使用 `ResultSet` 实现分页,可以通过设置 SQL 查询中的 LIMIT 子句来控制返回的结果数量。下面是一个简单的例子,展示了如何利用 JDBC 和 MySQL 数据库进行分页操作: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class PaginationExample { private static final String DB_URL = "jdbc:mysql://localhost:3306/your_database"; private static final String USER = "root"; private static final String PASS = ""; public void fetchPaginatedData(int pageNo, int pageSize) { try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) { // 计算起始位置 int offset = (pageNo - 1) * pageSize; // 构建带有限制条件的SQL语句 String sql = "SELECT id, name FROM users ORDER BY id ASC LIMIT ? OFFSET ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, pageSize); pstmt.setInt(2, offset); try (ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name")); } } } } catch (Exception e) { e.printStackTrace(); } } } ``` 此代码片段定义了一个名为 `fetchPaginatedData` 的方法,该方法接受两个参数:当前页面编号 (`pageNo`) 和每页大小 (`pageSize`)。通过计算偏移量并构建带有 `LIMIT` 和 `OFFSET` 关键字的 SQL 查询字符串,实现了对数据库记录的有效分页检索[^2]。 需要注意的是,在实际项目开发过程中应当考虑安全性问题,比如防止 SQL 注入攻击等风险;同时也应该考虑到不同数据库管理系统之间语法差异可能带来的兼容性挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值