有没有人知道从MySQL数据库返回的Java结果集中获取行数的更好方法?返回的结果集不会是从数据库中读取的总行数,因此我认为我不能使用SQL的COUNT
聚合函数。
public static int getResultSetRowCount(ResultSet resultSet) {
int size = 0;
try {
resultSet.last();
size = resultSet.getRow();
resultSet.beforeFirst();
}
catch(Exception ex) {
return 0;
}
return size;
}
答案 0 :(得分:21)
更好的答案是在成功将ResultSet加载到对象或集合之前忘记行数。您可以使用这些选项中的任何一个来保留行数。
在尽可能最窄的方法范围内关闭ResultSets(以及Connection和Statement等所有SQL资源)非常重要。这意味着不将ResultSet传递出持久层。最好使用Collection size()调用来获取行数。
不再考虑数据库并开始考虑对象。 Java是一种面向对象的语言。
答案 1 :(得分:9)
您可以执行
SELECT FOUND_ROWS()
执行SELECT语句后立即查找行数。
答案 2 :(得分:2)
在制作实际SELECT COUNT()
之前,您始终可以使用具有相同条件的SELECT
。
答案 3 :(得分:2)
如果您使用的是Java 6,则可以使用JDBC4ResultSet类,该类具有getUpdateCount方法,该方法返回受SQL语句影响的行数,即使对于Select语句也是如此。
见下面的示例代码:
PreparedStatement ps = con.prepareStatement("select * from any_table ...");
JDBC4ResultSet rs = (JDBC4ResultSet)ps.executeQuery();
int rowNumber = rs.getUpdateCount();
我希望有这个帮助!
答案 4 :(得分:2)
这是我对这个问题的解决方案(因为我主要想要返回构建数组或类似内容的记录数):使用Vector<T>之类的集合。
public Vector<T> getRecords(){
Vector<T> records = new Vector<T>();
init_conn_and_stmt_and_rs();
try {
rs = stmt.executeQuery("SELECT * FROM `table` WHERE `something` = 0");
while(rs.next()){
// Load the Vector here.
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
close_rs_and_stmt_and_conn();
}
return records;
}
清洁简单,不是吗?返回任何大小的记录集(无需事先知道大小),并使所有List
方法可用。
这对我来说已经有一段时间了,但如果有人看到这方面的缺陷,请告诉我。你知道,总是希望让我的实践更好。
答案 5 :(得分:1)
您还可以使用以下方法获取resultSet中的总记录:
statement = connect.createStatement();
resultSet = statement.executeQuery(sqlStatement);
resultSet.last();
int count = resultSet.getRow();
System.out.println(count);
count 是结果集返回的总行数。 ;)
答案 6 :(得分:0)
请参阅以下Lalith解决方案的示例代码:
public static int getResultSetRowCount(connection) {
int size = 0;
statement = connection.createStatement();
try {
resultSet = statement.executeQuery("SELECT FOUND_ROWS()")
resultSet.next()
size = resultSet.getInt(1)
}
catch(Exception ex) {
return 0;
}
statement.close();
return size;
}