获取由 Java 中的 ResultSet 返回的行数

我使用了返回一定数量行的 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返回的行数?还是我自己写?

275562 次浏览

您可以使用 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");
}

res.next()方法将获取指向下一行的指针。在您的代码中,您使用它两次,首先是 if 条件(光标移动到第一行) ,然后是 while 条件(光标移动到第二行)。

所以当你访问你的结果时,它从第二行开始,所以在结果中少显示一行。

你可以试试这个:

if(!res.next()){
System.out.println("No Data Found");
}
else{
do{
//your code
}
while(res.next());
}

首先,您应该创建 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 返回的行数

一个简单的 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,因此在创建连接时,您必须指定滚动选项。默认值为 前进,使用此方法将引发异常。

区分0行或某些行与 ResultSet 的另一种方法:

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.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.
}
}

您可以将 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;

您可以使用 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 计数基于一个标准。

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();
}
        rs.last();
int rows = rs.getRow();
rs.beforeFirst();

如果您的查询类似于这个 SELECT Count(*) FROM tranbook,那么执行这个 rs.next(); System.out.println(rs.getInt("Count(*)"));

您可能认为 JDBC 是一个丰富的 API,而 ResultSet 有那么多的方法,那么为什么不只是一个 getCount ()方法呢?对于很多数据库,例如 Oracle、 MySQL 和 SQL Server,ResultSet 是一个流 API,这意味着它不会从数据库服务器加载(甚至可能是提取)所有行。通过迭代到 ResultSet 的末尾,在某些情况下可能会大大增加执行所需的时间。

顺便说一句,如果你必须这样做,有几种方法,例如使用 ResultSet.last ()和 ResultSet.getRow ()方法,这不是最好的方法,但如果你绝对需要它,它可以工作。

但是,从 ResultSet 获取列计数在 Java 中很容易。JDBC API 提供了一个 ResultSetMetaData 类,该类包含一些方法,用于返回查询返回并由 ResultSet 保存的列数。

在我的示例中,我需要从 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。OutOfMemory 错误: Java 堆空间。在执行 rs.last ()方法时会发生此异常

3)再次访问 ResultSet,你得不到这样的信息: 用尽的结果集。因此,您需要使用 rs.first ()或 rs.Absol(1)将结果集重置为顶部。下面的代码片段说明了如何:

rs.first();
System.out.println(rs.getString(1));