Java ResultSet如何检查是否有任何结果

时间:2009-05-15 06:08:58

标签: java jdbc

Resultset没有针对hasNext的方法。我想检查resultSet是否有任何值

这是正确的方法

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

22 个答案:

答案 0 :(得分:495)

假设您正在使用新返回的ResultSet,其光标指向第一行之前,更方便的方法是调用isBeforeFirst()。这样可以避免在是否要读取数据时进行回溯。

As explained in the documentation,如果光标不在第一条记录之前,或者 ResultSet中没有行,则返回false。

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

答案 1 :(得分:220)

这是正确的,最初ResultSet的光标指向第一行之前,如果第一次调用next()返回false,那么{{1}中没有数据}}

如果您使用此方法,则可能需要在重置后立即调用ResultSet,因为它已将自己定位在第一行之后。

但应该注意,下面的Seifer's answer是这个问题更优雅的解决方案。

答案 2 :(得分:48)

你可以随时进行下一步,然后进行后循环检查

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

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

答案 3 :(得分:19)

你通常会这样做:

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

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

答案 4 :(得分:8)

最好使用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());
}

答案 5 :(得分:8)

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

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

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

答案 6 :(得分:8)

根据最可行的答案,建议是使用“isBeforeFirst()”。 如果您没有“仅向前型”,那么这不是最好的解决方案。

有一种名为“.first()”的方法。获得完全相同的结果并不是一件坏事。检查“结果集”中是否存在某些内容,并且不要使光标前进。

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

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

您也可以调用isBeforeFirst()来测试是否在没有前进光标的情况下返回任何行,然后正常进行。 - SnakeDoc 2014年9月2日19:00

但是,“isBeforeFirst()”和“first()”之间存在差异。如果在“仅向前”类型的结果集上完成,则首先生成异常。

比较两个投掷部分: 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#first()

好的,基本上这意味着你应该使用“isBeforeFirst”,只要你有“仅向前”类型。否则使用“first()”就不那么过分了。

答案 7 :(得分:5)

如果您想查看结果集中是否有任何行,那将会有效。

请注意,next()始终移至下一行,因此如果您计划从结果集中进行任何读取,则需要考虑这一点。

ResultSet(简单阅读时)的常用用法是:

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

如果您已经调用next()一次检查结果集是否为空,那么显然无法正常工作,请注意这一点。虽然有“备份”方法,但并不支持所有类型的结果集。

答案 8 :(得分:4)

我相信这是一本实用且易读的内容。

        if (res.next()) {
            do {

                // successfully in. do the right things.

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

答案 9 :(得分:2)

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

isAfterLast()也为空结果集返回false,但由于光标在第一行之前,所以这种方法似乎更清楚。

答案 10 :(得分:1)

我创建了以下方法来检查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 对象必须设置为让ResultSet对象在最后返回并返回顶部。

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

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

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

答案 11 :(得分:1)

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

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
 //resultSet contain some values
else
 // empty resultSet

答案 12 :(得分:1)

要做的最好的事情是检查第一行,这样当您打算获取数据时,可以避免跳过一行的错误。类似于:if(!resultSet.first()){System.out.println(“no data”); }

答案 13 :(得分:1)

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

答案 14 :(得分:1)

if(resultSet.first) {

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

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

答案 15 :(得分:0)

为什么不使用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)”似乎工作正常。

答案 16 :(得分:0)

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

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

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

有关详细信息,请参阅以下文档。 CollectionUtils

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

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

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

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

将当前行设置为位置i,如果该行不存在则将失败。这只是

的替代方法
while(rs.next()){
    //Code
}

答案 19 :(得分:0)

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内重新执行查询是更好的选择。

答案 20 :(得分:0)

你可以做这样的事情

boolean found = false;

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

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

答案 21 :(得分:-2)

最初,结果集对象(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())。