JavaResultSet 如何检查是否有任何结果

resultSet 没有 hasNext 的方法

这是正确的方法吗

if (!resultSet.next() ) {
System.out.println("no data");
}
522731 次浏览

这是正确的,最初ResultSet的游标指向第一行之前,如果第一次调用next()返回false,则ResultSet中没有数据。

如果你使用这个方法,你可能必须立即调用beforeFirst()来重置它,因为它现在已经将自己定位在第一行之后。

然而,应该注意的是,下面的赛义夫的回答是这个问题的一个更优雅的解决方案。

你通常会这样做:

while ( resultSet.next() ) {
// Read the next item
resultSet.getString("columnName");
}

如果要报告一个空集,请添加一个变量来计算读取的项。如果您只需要阅读一个项目,那么您的代码就足够了。

如果您想查看结果集中是否有任何行,这将起作用。

注意,next()总是移动到下一行,所以如果你计划从结果集中进行任何读取,你需要考虑到这一点。

通常使用ResultSet(当简单读取时)是:

while (resultSet.next())
{
... read from the row here ...
}

如果你已经调用next()一次来检查结果集是否为空,这显然不会正确工作,所以要注意这一点。尽管存在用于“备份”的方法,但并非所有类型的结果集都支持这些方法。

你总是可以在前面做下一个,只做一个后循环检查

if (!resultSet.next() ) {
System.out.println("no data");
} else {


do {
//statement(s)
} while (resultSet.next());
}

假设你正在处理一个新返回的ResultSet,它的光标指向第一行之前,一个更简单的检查方法是调用isBeforeFirst()。这避免了在读取数据时必须回溯。

正如文档中解释的那样,如果光标不在第一条记录之前,或者结果集中没有行. 正如文档中解释的那样返回false。

if (!resultSet.isBeforeFirst() ) {
System.out.println("No data");
}

,

if(resultSet.first) {


} else {
system.out.println("No raw or resultSet is empty");
}

因为如果ResultSet没有raw,那么resultSet.first返回false。

最好使用ResultSet.next()和do{…} while()语法。

“检查任何结果”调用ResultSet.next()将光标移动到第一行,因此使用do{…} while()语法来处理该行,同时继续处理循环返回的其余行。

通过这种方式,您可以检查任何结果,同时也可以处理返回的任何结果。

if(resultSet.next()) { // Checks for any results and moves cursor to first row,
do { // Use 'do...while' to process the first row, while continuing to process remaining rows


} while (resultSet.next());
}
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
status = "ERROR";
else
status = "SUCCESS";

为了完全确定无论光标位置如何,结果集是否为空,我将这样做:

public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
return (!rs.isBeforeFirst() && rs.getRow() == 0);
}

如果ResultSet为空,此函数将返回true;如果ResultSet为空,则返回false;如果ResultSet为关闭/未初始化,则抛出SQLException。

最好的方法是检查第一行,这样当您打算获取数据时就可以避免跳过一行的错误。类似于:if (!resultSet.first()) {System.out。println(没有数据);}

你可以这样做

boolean found = false;


while ( resultSet.next() )
{
found = true;
resultSet.getString("column_name");
}


if (!found)
System.out.println("No Data");

最初,结果集对象(rs)指向BFR(在第一条记录之前)。使用rs.next()后,光标指向第一条记录,rs值为“true”。使用while循环可以打印表中的所有记录。在检索到所有记录后,光标移动到ALR(在最后一条记录之后),它将被设置为null。让我们假设表中有2条记录。

if(rs.next()==false){
// there are no records found
}


while (rs.next()==true){
// print all the records of the table
}

简而言之,我们也可以将条件写成while (rs.next())。

通过使用resultSet.next(),您可以轻松地获得结果,无论resultSet是否包含任何值

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
//resultSet contain some values
else
// empty resultSet
ResultSet rs = rs.executeQuery();
if(rs.next())
{
rs = rs.executeQuery();
while(rs.next())
{
//do code part
}
}
else
{
//else if no result set
}

最好是重新执行查询,因为当我们调用if(rs.next()){....}时,ResultSet的第一行将被执行,在while(rs.next()){....}中,我们将从下一行得到结果。所以我认为在if中重新执行查询是更好的选择。

根据最可行的答案,建议使用“isBeforeFirst()”。如果没有"仅转发类型"这不是最好的解决方案

有一个方法叫做“当代()”。要得到完全相同的结果,这就不那么过分了。您检查“结果集”中是否有内容,但没有移动光标。

文档声明:“(…)如果有结果集中没有行则为false”。

if(rs.first()){
//do stuff
}

您也可以只调用isBeforeFirst()来测试是否有任何行返回而不移动游标,然后正常进行。- SnakeDoc 14年9月2日19:00

但是,"isBeforeFirst()"和"first()"是有区别的。首先,如果对“仅向前”类型的结果集执行操作,则会生成异常。

比较两个throw section: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst() http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html第() < / p >

好的,基本上这意味着你应该使用“isBeforeFirst”,只要你有一个“仅转发”类型。否则,使用“first()”就不会那么夸张了。

if (!resultSet.isAfterLast() ) {
System.out.println("No data");
}

isAfterLast()对于空结果集也返回false,但由于游标无论如何都在第一行之前,这个方法似乎更清楚。

我相信这是一篇实用且易于阅读的文章。

        if (res.next()) {
do {


// successfully in. do the right things.


} while (res.next());
} else {
// no results back. warn the user.
}

我一直试图将当前行设置为第一个索引(处理主键)。我建议

if(rs.absolute(1)){
System.out.println("We have data");
} else {
System.out.println("No data");
}

填充ResultSet时,它指向第一行之前。当将它设置为第一行(由rs.absolute(1)表示)时,它将返回true,表示它成功地放置在第一行,如果该行不存在则返回false。我们可以推断

for(int i=1; rs.absolute(i); i++){
//Code
}

它将当前行设置为位置I,如果该行不存在,将失败。这是另一种方法

while(rs.next()){
//Code
}

我创建了以下方法来检查ResultSet是否为空。

public static boolean resultSetIsEmpty(ResultSet rs){
try {
// We point the last row
rs.last();
int rsRows=rs.getRow(); // get last row number


if (rsRows == 0) {
return true;
}


// It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
rs.beforeFirst();
return false;
}catch(SQLException ex){
return true;
}
}

有以下几点考虑是非常重要的:

CallableStatement对象必须设置为让to ResultSet对象在结尾并返回到顶部。

TYPE_SCROLL_SENSITIVE: ResultSet对象可以在末尾移动并返回顶部。进一步可以捕捉最后的变化。

CONCUR_READ_ONLY:我们可以读取ResultSet对象数据,但不能更新。

CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

我认为检查结果集最简单的方法是通过包org.apache.commons.collections.CollectionUtils下的CollectionUtils

if(CollectionUtils.isNotEmpty(resultList)){
/**
* do some stuff
*/
}

这将检查null以及空结果集条件。

有关更详细的信息,您可以参考下面的文档。 CollectionUtils < / p >

为什么不使用rs.getRow()?

int getRow()
throws SQLException
Retrieves the current row number. The first row is number 1, the second number 2, and so on.
Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY


Returns:
the current row number; 0 if there is no current row
Throws:
SQLException - if a database access error occurs or this method is called on a closed result set
SQLFeatureNotSupportedException - if the JDBC driver does not support this method
Since:
1.2

对我来说,检查“if (rs.getRow() != 0)”似乎工作得很好。

if (resultSet==null ) {
System.out.println("no data");
}

提醒一句,

如果您正在使用org.springframework.jdbc.core.RowMapper 非常小心你是如何检查你的ResultSet是空的,因为

该方法不应该在ResultSet上调用next();它只应该映射当前行的值。 <-来自文档

在这种情况下,你的支票可能会变成

resultSet.beforeFirst();
if (!resultSet.next() ) {
System.out.println("no data");
}