我希望在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());
}
}
答案 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)
这是一个棘手的问题。
通常情况下,result.last()
滚动到ResultSet
的末尾,您无法返回。
如果您使用createStatement
或prepareStatement
方法之一创建了带有“resultSetType”参数的语句,并且您已将参数设置为ResultSet.TYPE_SCROLL_INSENSITIVE
或{{ 1}},然后您可以使用ResultSet.TYPE_SCROLL_SENSITIVE
或ResultSet
或其他一些方法滚动first()
。
但是,我不确定所有数据库/ 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>';