Java和mysql查询检查结果是否为空

时间:2012-12-11 21:55:46

标签: java mysql

ResultSet zoeken = stat.executeQuery("SELECT * FROM leden WHERE naam = '" + text + "'");
if (zoeken.getRow() == 0){
   System.out.println("hi");
}
while( zoeken.next() ){
   System.out.println(zoeken.getString(1) + zoeken.getString(2) + zoeken.getString(3));
}

我使用它来检查结果zoeken是否为空,但它会抛出一个异常,说不管它是否有效都是非法的。

检查结果是否为空的更好的解决方案

6 个答案:

答案 0 :(得分:9)

  

//我用它来检查结果“zoeken”是否为空,但是它   抛出一个例外,说这是非法的。无论如何   是否有效

在调用ResultSet.next()之前,请勿调用 ResultSet.getRow()

来自API:

  

ResultSet对象维护一个指向其当前行的光标   数据。最初,光标位于第一行之前。该   next方法将光标移动到下一行,因为它返回   当ResultSet对象中没有更多行时,它可以是false   在while循环中用于迭代结果集。

       ResultSet zoeken = stat.executeQuery("SELECT * FROM leden WHERE naam = '" + text + "'");
       boolean val = zoeken.next(); //next() returns false if there are no-rows retrieved 
        if(val==false){
            System.out.println("zoken is empty"); //prints this message if your resultset is empty
         }
        while(val){// only runs when there are rows in the resultset
           System.out.println(zoeken.getString(1) + zoeken.getString(2) + zoeken.getString(3));
          val=zoeken.next(); //updating val again to check if there are rows in result set
        }

如果您的结果集为空 zoeken.next()将返回 false ,在这种情况下,您的while循环将不会执行。

建议

使用PreparedStatement而不是简单的Statement。简单的声明将导致 SQL注入,并且还可以减轻编写复杂查询的痛苦。下面是使用PreparedStatement的示例代码。

String yourquery ="Select whatever From table where col1= ? and col2 =?"
PreparedStatement stmnt = Conn.preparedStatement(yourquery);
stmnt.setString(1, "val1");
stmnt.setString(2, "val2");

答案 1 :(得分:2)

使用next()方法

boolean hasNext = zoeken.next();

答案 2 :(得分:2)

以下代码适合您

if(!zoeken.first() && !zoeken.next())//if fist and next records are empty
{
System.out.println("Result set is empty");
}
else
{
System.out.println("Result set is not empty");
}

答案 3 :(得分:0)

根据next(),您必须首先使用next,然后使用getRow()

ResultSet zoeken = stat.executeQuery("SELECT * FROM leden WHERE naam = '" + text + "'");
while( zoeken.next() ){
    int rowNum = zoeken.getRow();
    System.out.println(zoeken.getString(1) + zoeken.getString(2) + zoeken.getString(3));
}

答案 4 :(得分:0)

不使用Result Set next(),您无法检查大小或resultSet周期。

ResultSet游标最初位于第一行之前。

答案 5 :(得分:0)

我知道OP可能不再需要这些信息,但是如果有人偶然发现这一点,我会同意@PermGenError所说的一切虽然,我觉得对于给定代码更优雅的解决方案但是使用预处理语句将是:

PreparedStatement ps = conn.prepareStatement("SELECT * FROM leden WHERE naam = ?");
ps.setString(title);
ResultSet rs = ps.executeQuery();

if (rs.next()) {
    do {
        System.out.println(zoeken.getString(1) + zoeken.getString(2) + zoeken.getString(3));
    } while (rs.next());
} else {
    System.out.println("hi");
}

我写了这个写意,所以请原谅任何错误,或者如果不编译。我只是觉得这更清楚,减少了局部变量的使用。如果至少有一行,则打印该行并继续这样做,直到没有更多的行,否则说“hi”。但我想你会想说一些比“喜欢”更有用的东西,或许是“找不到结果”的消息或其他东西。