jsp:由rs.last()方法不可用,学习ResultSet游标笔记 .

本文介绍了一种在Java中使用SQL查询获取数据集总行数的方法。针对使用默认只读向前游标时遇到的问题,提供了通过设置游标类型为可滚动的方式来解决。这种方法适用于需要进行翻页操作的文章列表等场景。

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

问题起因:
今天学习做一个文章列表翻页的程序需要获得数据集中的数据总行数
我用的方法如下:
--------------------------------------------------
int RowCount = 0;
rs.last();
RowCount= rs.getRow();
//移动到最后检索当前行编号获取总行数 。
out.print("总行数:" + RowCount + "<br/>");
//out.print("isLast:" + rs.isLast() + "<br/>");
//out.print("isAfterLast:" + rs.isAfterLast() + "<br/>");
rs.beforeFirst(); //便于后面输出数据
---------------------------------------------------
执行到rs.last()时候就提示不支持这个方法!
[Microsoft][SQLServer 2000 Driver for JDBC]Unsupported method: ResultSet.last

资料分析:
=============================游标只读向前================================
java.sql
接口:Connection
方法:createStatement
Statement createStatement()
throws SQLException
创建一个 Statement 对象来将 SQL 语句发送到数据库。
没有参数的 SQL 语句通常使用 Statement 对象执行。
如果多次执行相同的 SQL 语句使用 PreparedStatement 对象可能更有效。
使用返回的 Statement 对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY
并带有 CONCUR_READ_ONLY 并发级别。[---注意这里默认是只读向前的游标]

返回:
一个新的默认 Statement 对象
抛出:
SQLException - 如果发生数据库访问错误

===========================游标自定义======================================
java.sql
接口:Connection
方法:createStatement
Statement createStatement(int resultSetType,
int resultSetConcurrency)
throws SQLException
创建一个 Statement 对象该对象将生成具有

给定类型和并发性的 ResultSet 对象。此方法与上述 createStatement 方法相同但它允许重写

默认结果集类型和并发性。

参数:
resultSetType - 结果集类型它是
---ResultSet.TYPE_FORWARD_ONLY、 //游标向前
---ResultSet.TYPE_SCROLL_INSENSITIVE 或 //该常量指示可滚动但通常不受其他的更改影响的rs类型
---ResultSet.TYPE_SCROLL_SENSITIVE 之一//常量指示可滚动并且通常受其他的更改影响的rs类型。

resultSetConcurrency - 并发类型;它是
---ResultSet.CONCUR_READ_ONLY 或 //只读
---ResultSet.CONCUR_UPDATABLE 之一 //可以修改
返回:
一个新的 Statement 对象该对象将生成具有给定类型和并发性的 ResultSet 对象
抛出:
SQLException - 如果发生数据库访问错误或者给定参数不是指示类型和并发性的 ResultSet 常量
从以下版本开始:
1.2

解决办法:

在创建Statement对象时指定游标参数
conn = DriverManager.getConnection(getConnectionUrl(),dbUserName,dbPassword);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);


`java.sql.SQLException: ResultSet operation not allowed after ResultSet closed` 这是一个常见的 SQL 异常错误提示,表示尝试对已经关闭的 `ResultSet` 对象进行操作。 ### 原因分析 1. **资源未正确管理**:通常在数据库查询完成后,`ResultSet`, `Statement` 和 `Connection` 都需要手动关闭。如果过早地关闭了 `ResultSet` 或其关联的 `Statement`、`Connection`,那么后续对该 `ResultSet` 的访问就会抛出这个异常。 2. **游标的生命周期结束**:SQL 查询结果是由数据库服务器返回的一个“指针”或“游标”,当该游标被显式或隐式关闭后,再次对其进行读取会失败。 3. **连接池的行为影响**:如果你使用的是一种数据库连接池技术,在某些框架下可能会自动回收和关闭底层的对象,而此时程序仍试图继续处理已关闭的结果集。 ### 解决方案 为了避免上述问题发生,请注意以下几点: - 确保所有相关的对象 (`ResultSet`, `Statement`, `PreparedStatement`) 按正确的顺序关闭,并尽量靠近它们作用域末端的位置释放; - 尽量将数据从 `ResultSet` 中提取出来并存储到本地变量或其他结构(如 List<Map<String, Object>>),然后再断开与数据库之间的物理链接; ```java try (Connection conn = DriverManager.getConnection(DB_URL); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table")) { while(rs.next()){ // Process each row... } } catch(SQLException e){ System.err.println(e.getMessage()); } ``` 通过使用 Java7+ 推荐的 try-with-resources 自动化机制可以有效避免内存泄漏及类似本题这样的运行期错误情况出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值