[英]Get Number of Rows returned by ResultSet in Java
我使用了一个ResultSet
返回一定的行数。 我的代码是这样的:
ResultSet res = getData();
if(!res.next())
{
System.out.println("No Data Found");
}
while(res.next())
{
// code to display the data in the table.
}
是否有任何方法可以检查ResultSet
返回的行数? 还是我必须自己写?
首先,您应该创建可以通过命令移动光标的Statement
:
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
然后检索ResultSet
如下:
ResultSet rs = stmt.executeQuery(...);
将光标移动到最新行并获取它:
if (rs.last()) {
int rows = rs.getRow();
// Move to beginning
rs.beforeFirst();
...
}
然后行变量将包含由 sql 返回的行数
您可以使用do ... while
循环而不是while
循环,以便在执行循环后调用rs.next()
,如下所示:
if (!rs.next()) { //if rs.next() returns false
//then there are no rows.
System.out.println("No records found");
}
else {
do {
// Get data from the current row and use it
} while (rs.next());
}
或者在获取行数时自己计算行数:
int count = 0;
while (rs.next()) {
++count;
// Get data from the current row and use it
}
if (count == 0) {
System.out.println("No records found");
}
一个简单的getRowCount
方法如下所示:
private int getRowCount(ResultSet resultSet) {
if (resultSet == null) {
return 0;
}
try {
resultSet.last();
return resultSet.getRow();
} catch (SQLException exp) {
exp.printStackTrace();
} finally {
try {
resultSet.beforeFirst();
} catch (SQLException exp) {
exp.printStackTrace();
}
}
return 0;
}
请注意,此方法需要滚动敏感的resultSet
,因此在创建连接时必须指定滚动选项。 默认值为FORWARD ,使用此方法会引发异常。
从 ResultSet 中区分 0 行或某些行的另一种方法:
ResultSet res = getData();
if(!res.isBeforeFirst()){ //res.isBeforeFirst() is true if the cursor
//is before the first row. If res contains
//no rows, rs.isBeforeFirst() is false.
System.out.println("0 rows");
}
else{
while(res.next()){
// code to display the rows in the table.
}
}
如果你必须知道给定一个 ResultSet 的行数,这里有一个获取它的方法:
public int getRows(ResultSet res){
int totalRows = 0;
try {
res.last();
totalRows = res.getRow();
res.beforeFirst();
}
catch(Exception ex) {
return 0;
}
return totalRows ;
}
res.next()
方法将指针指向下一行。 并且在您的代码中,您使用它两次,首先是 if 条件(光标移动到第一行),然后是 while 条件(光标移动到第二行)。
因此,当您访问结果时,它从第二行开始。 所以在结果中显示少一行。
你可以试试这个:
if(!res.next()){
System.out.println("No Data Found");
}
else{
do{
//your code
}
while(res.next());
}
您可以使用 sql 计算并从结果集中检索答案,如下所示:
Statment stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet ct = stmt.executeQuery("SELECT COUNT(*) FROM [table_name]");
if(ct.next()){
td.setTotalNumRows(ct.getInt(1));
}
在这里,我正在计算所有内容,但您可以轻松修改 SQL 以根据标准进行计数。
rs.last();
int rows = rs.getRow();
rs.beforeFirst();
您可能认为 JDBC 是一个丰富的 API,而 ResultSet 有这么多方法,那为什么不只是一个 getCount() 方法呢? 好吧,对于许多数据库,例如 Oracle、MySQL 和 SQL Server,ResultSet 是一个流式 API,这意味着它不会从数据库服务器加载(甚至可能获取)所有行。 通过迭代到 ResultSet 的末尾,您可能会在某些情况下显着增加执行时间。
顺便说一句,如果你必须有几种方法来做到这一点,例如使用 ResultSet.last() 和 ResultSet.getRow() 方法,这不是最好的方法,但如果你绝对需要它,它就可以工作。
不过,在 Java 中从 ResultSet 获取列数很容易。 JDBC API 提供了一个 ResultSetMetaData 类,该类包含返回查询返回的列数并由 ResultSet 保存的方法。
您可以将 ResultSet 加载到 TableModel 中,然后创建一个使用该 TableModel 的 JTable,然后使用 table.getRowCount() 方法。 如果要显示查询结果,无论如何都必须这样做。
ResultSet resultSet;
resultSet = doQuery(something, somethingelse);
KiransTableModel myTableModel = new KiransTableModel(resultSet);
JTable table = new JTable(KiransTableModel);
int rowCount;
rowCount = table.getRowCount;
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=st.executeQuery("select * from emp where deptno=31");
rs.last();
System.out.println("NoOfRows: "+rs.getRow());
第一行代码表示我们可以移动结果集中的任何位置(第一行或最后一行或第一行之前,无需从第一行开始逐行遍历,这很耗时)。第二行代码获取记录匹配这里我假设的查询(25 条记录),第三行代码将光标移动到最后一行,最后一行代码获取当前行号,在我的情况下为 25。 如果没有记录,rs.last 返回 0 并且 getrow 将光标移动到第一行之前,因此返回负值表示 db 中没有记录
这是我的解决方案
ResultSet rs=Statement.executeQuery("query");
int rowCount=0;
if (!rs.isBeforeFirst())
{
System.out.println("No DATA" );
} else {
while (rs.next()) {
rowCount++;
System.out.println("data1,data2,data3...etc..");
}
System.out.println(rowCount);
rowCount=0;
rs.close();
Statement.close();
}
如果您的查询类似于SELECT Count(*) FROM tranbook
,则执行此rs.next(); System.out.println(rs.getInt("Count(*)"));
rs.next(); System.out.println(rs.getInt("Count(*)"));
就我而言,我需要从 ResultSet 获取总行数,如果总行数未达到 XLS 文件的限制,还需要访问 ResultSet 值。
为此,我必须对我的代码进行两项调整:
1) 对象构造 PreparedStatement 的变化
默认的 ResultSet 对象有一个只能向前移动的游标。 因此,您只能遍历它一次,并且只能从第一行到最后一行。 可以生成可滚动的 ResultSet 对象。 以下代码片段说明了如何制作可滚动且对他人更新不敏感的结果集。
PreparedStatement ps = connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
2)获取总行数。 以下代码片段说明了如何:
ResultSet rs = ps.executeQuery();
rs.last();
int totalRowsResult = rs.getRow();
PS:如果查询结果的记录数过大,可能会导致Java服务器内存不足,抛出异常:java.lang.OutOfMemoryError: Java heap space。 执行rs.last()方法时会出现这个异常
3) 再次访问 ResultSet 并且您没有收到消息:exhausted result set。 因此,您需要使用 rs.first() 或 rs.absolute(1) 将结果集重置为顶部。 以下代码片段说明了如何:
rs.first();
System.out.println(rs.getString(1));
您可以使用res.previous()
如下:
ResulerSet res = getDate();
if(!res.next()) {
System.out.println("No Data Found.");
} else {
res.previous();
while(res.next()) {
//code to display the data in the table.
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.