繁体   English   中英

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

[英]How to get the size of a java.sql.ResultSet?

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

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

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

也可以看看:

你可以做result.last(); 并调用result.getRow(); (检索当前行号)进行计数。 但是它会加载所有行,并且如果结果集很大,可能效率不高。 最好的方法是事先对查询执行SELECT COUNT(*)并获得计数,如博文中所示。

这是一个棘手的问题。

  1. 通常, result.last()滚动到ResultSet的末尾,并且您不能返回。

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

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

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

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

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

rs.beforeFirst();  

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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