获取 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返回的行数吗? 还是我必须自己写?

首先,您应该创建可以通过命令移动光标的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,使用此方法将引发异常。

另一种区分 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.next()方法会将指针指向下一行。 在您的代码中,您将使用它两次,第一次用于 if 条件(光标移动到第一行(,然后用于 while 条件(光标移动到第二行(。

因此,当您访问结果时,它会从第二行开始。因此在结果中显示少了一行。

你可以试试这个:

if(!res.next()){ 
    System.out.println("No Data Found");  
}
else{
    do{
       //your code
    } 
    while(res.next());
}
        rs.last();
        int rows = rs.getRow();
        rs.beforeFirst();

您可以使用 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以根据条件进行计数。

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

顺便说一句,如果你必须有几种方法可以做到这一点,例如通过使用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

如果您的查询是这样的SELECT Count(*) FROM tranbook,则执行此rs.next(); System.out.println(rs.getInt("Count(*)"));

就我而言,我需要从结果集中获取总行数,如果总行数未达到 XLS 文件的限制,还需要访问 ResultSet 值。

为此,我必须对代码进行两项调整:

1( 对象结构的变化 准备声明

默认的结果集对象具有仅向前移动的游标。因此,您只能循环访问一次,并且只能从第一行循环访问到最后一行。可以生成可滚动的结果集对象。下面的代码片段演示如何使结果集可滚动且对其他人的更新不敏感。

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堆空间。执行 rs.last (( 方法时将发生此异常

3( 再次访问结果集,您不会收到消息:扩展结果集。因此,vou 需要使用 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.
    }
}

相关内容

  • 没有找到相关文章

最新更新