最近使用ResultSet发现一些问题,集中表现为
多次执行 stmt.executeQuery方法,获得的数据集有时为空,有时提醒 结果集已耗尽,有时调用 first()方法等提示 对只转发结果集的无效操作: first
经系统研究 ResultSet特性后,总结如下:
1.ResultSet rs = stmt.executeQuery(sql);
当让stmt来返回一个结果集的时候,前面一个ResultSet会自动关闭。
即在执行stmt.executeQuery的时候,会自动关闭上一次stmt.executeQuery的结果集。
所以,我们用:
ResultSet rs = stmt.executeQuery(sql);
while(){……}
rs2 = stmt.executeQuery(sql2);
while(){……}
rs3 = stmt.executeQuery(sql3);
while(){……}
是没有问题的,因为我们在用下一个结果集的时候,没再去前一个中拿数据。
但是,在有嵌套的时候:
while (rs.next()) {
String sql2 = "select * from role_areamap";
rs2 = stmt.executeQuery(sql2);
while (rs2.next()) {
System.out.println(rs.getString(1));
}
System.out.println(rs.getInt(1));
}
就会报错了。
解决方法:1,再新建一个Statement
每次获取结果集用不同的 Statement 对象去执行sql
2.用Jdbc3.0的新特性:Statement.KEEP_CURRENT_RESULT
在Statement建立时 stmt = conn.createStatement();
使用的是默认参数(结果集类型为ResultSet.TYPE_FORWARD_ONLY),这种类型的结果集只能通过rs.next();方法逐条读取,使用其他读取方法时就会报错。如果需要执行一些其他或复杂的移动结果集指针的操作就要使用其它参数。
如,更改如下,可解决:
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
各参数介绍:
1. ResultSet.TYPE_FORWARD_ONLY (默认方式,略)
2. ResultSet.TYPE_SCROLL_INSENSITIVE 双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。
3. ResultSet.TYPE_SCROLL_SENSITIVE 双向滚动,并及时跟踪数据库里的更新,以便更改ResultSet中的数据。
4. ResultSet.CONCUR_READ_ONLY 只读取ResultSet
5. ResultSet.CONCUR_UPDATABLE 用ResultSet更新数据库
最近使用ResultSet发现一些问题,集中表现为多次执行 stmt.executeQuery方法,获得的数据集有时为空,有时提醒 结果集已耗尽,有时调用 first()方法等提示对只转发结果集的无效操作: first经系统研究ResultSet特性后,总结如下:1.ResultSet rs = stmt.executeQuery(sql);当让stmt来返回一个结果集的时候,前面一个ResultSet会自动关闭。即在执行stmt.executeQuery的时候,会自动关闭上一次...
一提起SQL注入,大家想到的肯定是不安全,有漏洞,需要避免,但是今天这个文章是要记录一下我在学习过程中遇到的需要
使用
SQL注入的场景。
首先先来简单看一下SQL注入所带来的安全漏洞:
package com.xzh.jdbc;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
模拟实现用户登录功能
public class T...
execute
Query、
execute
Update 和
execute
接口提供了三种
执行
SQL 语句的方法:
execute
Query、
execute
Update 和
execute
。
使用
哪一个方法由 SQL 语句所产生的内容决定。
方法
execute
Query 用于产生单个结果
集
的语句,例如 SELECT 语句。
方法
execute
Update 用于
执行
INS
关于
ResultSet
中,while只读取一次
问题
的原因:while循环中有一个新的
ResultSet
,和上一个
ResultSet
用的是同一个Statement,
上图中两个
resultset
用了同一个statement,会造成第一个
resultset
关闭,所以一次就退出。
解决方案:新声明一个statement,不同的
resultset
用不同的statement即可。
java.sql.SQLException: 结果
集已
耗尽
是一个JDBC异常,表示已经遍历完了结果
集
中的所有数据。
当
使用
JDBC从数据库中查询数据时,查询结果会以结果
集
的形式返回给应用程序。结果
集
是一个类似表格的结构,包含了一系列的记录和字段。
当我们向结果
集
中读取数据时,
使用
next()方法将指针移动到下一行,并返回一个布尔值,表示下一行是否存在。如果存在,我们可以获取该行的数据。如果不存在,即遍历完了整个结果
集
,将抛出java.sql.SQLException: 结果
集已
耗尽
异常。
这个异常通常出现在以下情况下:
1. 当
使用
ResultSet
对象从数据库中读取数据时,读取到最后一行,然后再次调用next()方法。
2. 当在一个
ResultSet
对象读取数据时,将
ResultSet
对象传递给其他方法或者其他线程,而这个
ResultSet
对象已经遍历完了所有数据。
3. 当
使用
同一个Statement对象
执行
多个查询语句时,如果没有
使用
close()方法显式关闭
ResultSet
对象,那么当
执行
下一个查询时,结果
集已
经被
耗尽
。
为了避免java.sql.SQLException: 结果
集已
耗尽
异常,我们可以在
使用
ResultSet
对象之后,及时关闭
ResultSet
、Statement和Connection对象,以释放资源。同时,在
使用
ResultSet
对象之前,也可以先调用next()方法检查是否存在下一行数据,避免无法读取数据时抛出异常。
总之,java.sql.SQLException: 结果
集已
耗尽
异常表示已经读取完了结果
集
中的数据,可通过关闭
ResultSet
、Statement和Connection对象以及在
使用
ResultSet
之前检查是否存在下一行数据来避免该异常的发生。
### 回答2:
java.sql.SQLException: 结果
集已
耗尽
是指在
使用
JDBC 进行数据库查询时,结果
集已
经被遍历完毕,没有更多的数据可供访问。
当
使用
ResultSet
对象获取数据库查询的结果
集
时,通常会
使用
next() 方法来判断是否还有更多的数据行可供读取。如果 next() 方法返回 false,即表示结果
集已
经到达末尾。
出现
ResultSet
exhausted 的原因可能有以下几种情况:
1. 结果
集已
经被完全遍历:通过在循环中
使用
next() 方法遍历结果
集
时,如果没有在循环中提前退出或跳出循环,可能导致结果
集
被完全遍历。
示例代码如下:
```java
ResultSet
rs = statement.
execute
Query("SELECT * FROM table_name");
while (rs.next()) {
// 遍历结果
集
的每一行数据
// ...
// 循环结束后,结果
集已
经
耗尽
2. 结果
集
使用
完毕后未关闭:
使用
完
ResultSet
对象后,应该及时调用 close() 方法关闭结果
集
,以释放相关资源。
示例代码如下:
```java
ResultSet
rs = statement.
execute
Query("SELECT * FROM table_name");
// 处理结果
集
数据
// ...
rs.close(); // 关闭结果
集
3. 结果
集
在查询语句
执行
后未立即访问:某些情况下,当查询语句
执行
后,如果不立即访问结果
集
,而是先
执行
其他
操作
,可能导致结果
集
耗尽
。
示例代码如下:
```java
ResultSet
rs = statement.
execute
Query("SELECT * FROM table_name");
// 其他业务逻辑处理
// ...
while (rs.next()) {
// 访问结果
集
数据
// ...
为避免出现结果
集已
耗尽
的异常,应该在
使用
ResultSet
对象时及时关闭结果
集
,并在
执行
查询后立即访问结果
集
。另外,也可以通过判断结果
集
的元数据(例如列数、列类型等)来确定是否有数据可供读取。
### 回答3:
java.sql.SQLException: 结果
集已
耗尽
,是指在
使用
Java程序连接数据库,并且
执行
SQL查询语句后,尝试获取结果
集
中的下一行数据时,但是结果
集已
经没有更多的数据可供获取,此时程序会抛出此异常。
这种情况通常发生在以下几种情况下:
1. 在
使用
游标(
ResultSet
)遍历结果
集
时,已经遍历到结果
集
的最后一行,再次调用next()方法获取下一行数据时,就会出现该异常。
2. 在
使用
游标(
ResultSet
)遍历结果
集
时,再次调用next()方法获取下一行数据时,结果
集已
经被其他
操作
关闭了,导致结果
集
不可访问,此时也会抛出该异常。
3. 在
使用
游标(
ResultSet
)遍历结果
集
时,结果
集
的大小与代码逻辑不符合,比如结果
集
本应该有5行数据,但是已经提前遍历到了第6行,再次获取数据时就会出现该异常。
要解决这个
问题
,可以采取以下措施:
1. 在
使用
游标遍历结果
集
时,
使用
if语句判断是否还有下一行数据,避免出现结果
集已
耗尽
的情况。如:
while(
resultSet
.next()){
// 获取数据
2. 在多线程环境下,对于可能会关闭结果
集
的
操作
,需要进行合适的同步处理,避免在其他线程中关闭结果
集
时,当前线程还在尝试获取数据。
3. 检查代码逻辑,确保结果
集
的大小与代码中对结果
集
的
操作
一致,避免出现不一致的情况。
总结:当出现java.sql.SQLException: 结果
集已
耗尽
的异常时,说明在
操作
结果
集
时,结果
集已
经没有更多的数据可供获取了。解决该
问题
可以通过合理的代码逻辑和对结果
集
的判断,避免出现该异常。
如何从oracle官方网站下载instant client文件, instantclient-basic-win32-11.1.0.x.0.zip, instantclient-basic-win64
如何从oracle官方网站下载instant client文件, instantclient-basic-win32-11.1.0.x.0.zip, instantclient-basic-win64
qq_42096580: