繁体   English   中英

获取Java中ResultSet返回的行数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM