如何获取java.sql.ResultSet的大小?

时间:2011-02-27 03:49:21

标签: java jdbc

我希望在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());
    }
}

5 个答案:

答案 0 :(得分:4)

  

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

将其映射到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.
}

另见:

答案 1 :(得分:2)

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

答案 2 :(得分:2)

这是一个棘手的问题。

  1. 通常情况下,result.last()滚动到ResultSet的末尾,您无法返回。

  2. 如果您使用createStatementprepareStatement方法之一创建了带有“resultSetType”参数的语句,并且您已将参数设置为ResultSet.TYPE_SCROLL_INSENSITIVE或{{ 1}},然后您可以使用ResultSet.TYPE_SCROLL_SENSITIVEResultSet或其他一些方法滚动first()

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

答案 3 :(得分:1)

获取ResultSet大小的方法,不需要使用ArrayList等

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

现在您将获得大小,如果您想要打印ResultSet,在打印之前也使用以下代码行,

rs.beforeFirst();  

答案 4 :(得分:-1)

还有另一种从DB获取计数的方法。

注意: 当DBA执行实时统计

时,此列会更新
select num_rows from all_Tables where table_name ='<TABLE_NAME>';