这不是一个很简单的手术吗?但是,我看到既没有size()也没有length()方法。


当前回答

当使用rs.last()时,我得到了一个异常

if(rs.last()){
    rowCount = rs.getRow(); 
    rs.beforeFirst();
}

:

java.sql.SQLException: Invalid operation for forward only resultset

因为默认情况下它是ResultSet。TYPE_FORWARD_ONLY,这意味着只能使用rs.next()

解决方案是:

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY); 

其他回答

int i = 0;
while(rs.next()) {
    i++;
}
String sql = "select count(*) from message";
ps =  cn.prepareStatement(sql);

rs = ps.executeQuery();
int rowCount = 0;
while(rs.next()) {
    rowCount = Integer.parseInt(rs.getString("count(*)"));
    System.out.println(Integer.parseInt(rs.getString("count(*)")));
}
System.out.println("Count : " + rowCount);

(速度考虑)

很多人在这里建议ResultSet.last(),但你需要打开连接作为一个ResultSet。TYPE_SCROLL_INSENSITIVE,对于Derby嵌入式数据库,它比ResultSet.TYPE_FORWARD_ONLY慢10倍。

根据我对嵌入式Derby和H2数据库的微型测试,在SELECT之前调用SELECT COUNT(*)要快得多。

下面是我的代码和基准测试的更详细信息

当使用rs.last()时,我得到了一个异常

if(rs.last()){
    rowCount = rs.getRow(); 
    rs.beforeFirst();
}

:

java.sql.SQLException: Invalid operation for forward only resultset

因为默认情况下它是ResultSet。TYPE_FORWARD_ONLY,这意味着只能使用rs.next()

解决方案是:

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY); 

我也有同样的问题。以这种方式使用ResultSet.first()在执行后解决它:

if(rs.first()){
    // Do your job
} else {
    // No rows take some actions
}

文档(链接):

布尔第一次() 抛出SQLException异常 将光标移动到此ResultSet对象的第一行。 返回: 如果光标位于有效的 行;如果结果集中没有行,则为False 抛出: SQLException—如果发生数据库访问错误;在封闭的结果集或结果集类型为TYPE_FORWARD_ONLY时调用此方法 SQLFeatureNotSupportedException—如果JDBC驱动程序不支持 这个方法 自: 1.2