【问题标题】:How to get the size of a java.sql.ResultSet?如何获取 java.sql.ResultSet 的大小?
【发布时间】:2011-07-05 02:49:56
【问题描述】:

我想在 while 循环中获取 ResultSet 的大小。

尝试了下面的代码,我得到了我想要的结果。但它似乎与result.next() 混淆了,如果我这样做,while 循环只会循环一次。 这样做的正确方法是什么?

result.first();
while (result.next()){

    System.out.println(result.getString(2));
    System.out.println("A. " + result.getString(5) + "\n" + "B. " + result.getString(6) + "\n" + "C. " + result.getString(7) + "\n" + "D. " + result.getString(8));
    System.out.println("Answer: ");
    answer = inputquiz.next();

    result.last();

    if (answer.equals(result.getString(10))) {
        score++;
        System.out.println(score + "/" + result.getRow());
    } else {
        System.out.println(score + "/" + result.getRow());
    }
}

【问题讨论】:

标签: java jdbc


【解决方案1】:

ResultSet大小的获取方式,不用ArrayList等

int size =0;  
if (rs != null)   
{  
rs.beforeFirst();  
 rs.last();  
size = rs.getRow();
}

现在你会得到大小,如果你想打印结果集,在打印之前也使用下面的代码行,

rs.beforeFirst();  

【讨论】:

    【解决方案2】:

    这样做的正确方法是什么?

    将其映射到List<Entity>。由于您的代码远非自我记录(您使用的是索引而不是列名),因此我无法给出一个非常合适的示例。所以我以Person 为例。

    首先创建一个 javabean 类来表示单行包含的任何内容。

    public class Person {
        private Long id;
        private String firstName;
        private String lastName;
        private Date dateOfBirth;
    
        // Add/generate c'tors/getters/setters/equals/hashcode and other boilerplate.
    }
    

    (有点像 Eclipse 这样的 IDE 可以自动生成它们)

    然后让 JDBC 做下面的工作。

    List<Person> persons = new ArrayList<Person>();
    
    while (resultSet.next()) {
        Person person = new Person();
        person.setId(resultSet.getLong("id"));
        person.setFirstName(resultSet.getString("fistName"));
        person.setLastName(resultSet.getString("lastName"));
        person.setDataOfBirth(resultSet.getDate("dateOfBirth"));
        persons.add(person);
    }
    
    // Close resultSet/statement/connection in finally block.
    
    return persons;
    

    那你就可以了

    int size = persons.size();
    

    然后替换您的代码示例

    for (int i = 0; i < persons.size(); i++) {
        Person person = persons.get(i);
        System.out.println(person.getFirstName());
        int size = persons.size(); // Do with it whatever you want.
    }
    

    另见:

    【讨论】:

      【解决方案3】:

      还有另一种方法可以从 DB 中获取计数。

      注意: 当 DBA 进行实时统计时,此列会更新

      select num_rows from all_Tables where table_name ='<TABLE_NAME>';
      

      【讨论】:

        【解决方案4】:

        这是一个棘手的问题。

        1. 正常情况下,result.last() 会滚动到ResultSet 的末尾,并且无法返回。

        2. 如果您使用带有“resultSetType”参数的createStatementprepareStatement 方法之一创建语句,并且已将参数设置为ResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_SENSITIVE,则可以滚动ResultSet 使用first()relative() 或其他一些方法。

        但是,我不确定是否所有数据库/JDBC 驱动程序都支持可滚动结果集,这样做可能会影响性能。 (可滚动的结果集意味着数据库或 JVM 需要在某处缓冲整个结果集……或重新计算它……这对于大型结果集来说代价高昂。)

        【讨论】:

          【解决方案5】:

          您可以执行result.last(); 并调用result.getRow();(检索当前行号)来获取计数。但它会加载所有行,如果它是一个很大的结果集,它可能不是很有效。最好的方法是对您的查询进行SELECT COUNT(*) 并事先获得this post 中演示的计数。

          【讨论】:

            猜你喜欢
            • 2017-08-14
            • 1970-01-01
            • 2011-02-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-10
            • 2019-07-11
            相关资源
            最近更新 更多