Java 如果JDBC的结果为空,如何返回false

Java 如果JDBC的结果为空,如何返回false,java,mysql,jdbc,Java,Mysql,Jdbc,在我的代码中,我需要当查询结果为空时,它应该返回false 我的代码: public boolean user_bookValidationQuery(String userID, String bookID) { Connection con; PreparedStatement ps; String query = " select * from borrowed where userID=? and bookID=? "; try {

在我的代码中,我需要当查询结果为空时,它应该返回
false

我的代码:

public boolean user_bookValidationQuery(String userID, String bookID) {
    Connection con;    
    PreparedStatement ps;    
    String query = " select * from borrowed where userID=? and bookID=? ";    
    try {    
        con = DriverManager.getConnection(...);    
        ps = con.prepareStatement(query);    
        ps.setString(1, userID);    
        ps.setString(2, bookID);
        if (ps.execute()) {
            System.out.println("You can do it! , id DB");
            return true;
        } else return false;

    } catch (SQLException sqle) {
        sqle.printStackTrace();
        return false;
    }
}
现在,对于
userID
bookID
的给定值,我在mysql控制台中尝试,看到它的结果是空的,但在我的代码中它仍然返回
true


为什么这里不为false?

空结果并不意味着发生了SQL异常。您需要检查结果是否为空,然后返回false。

空结果并不意味着发生了SQL异常。您需要检查结果是否为空,然后返回false。

您需要检查语句的结果

ResultSet rs= ps.execute();
rs.isBeforeFirst()
如果结果集中没有行,将返回false

因此,您的代码应该如下所示:

try {
    con = DriverManager.getConnection(...);
    ps = con.prepareStatement(query);
    ps.setString(1, userID);
    ps.setString(2, bookID);
    ResultSet rs= ps.execute();

    if (!rs.isBeforeFirst() ) {    
          System.out.println("empty"); 
          return false;
    }else {
          System.out.println("with data"); 
          return true;
    }

} catch (SQLException sqle) {
    sqle.printStackTrace();
    return false;
}

您需要检查语句的结果

ResultSet rs= ps.execute();
rs.isBeforeFirst()
如果结果集中没有行,将返回false

因此,您的代码应该如下所示:

try {
    con = DriverManager.getConnection(...);
    ps = con.prepareStatement(query);
    ps.setString(1, userID);
    ps.setString(2, bookID);
    ResultSet rs= ps.execute();

    if (!rs.isBeforeFirst() ) {    
          System.out.println("empty"); 
          return false;
    }else {
          System.out.println("with data"); 
          return true;
    }

} catch (SQLException sqle) {
    sqle.printStackTrace();
    return false;
}
为什么这里不假

根据javadoc:

返回:
true
如果第一个结果是
ResultSet
对象
false
如果第一个结果是更新计数或没有结果

在您的情况下,第一个结果将是
ResultSet
对象。空的
ResultSet
仍然是
ResultSet


在这种情况下(例如,当SQL是“选择”时),解决方案是使用
executeQuery
并使用`ResultSet.isBeforeFirst()测试
ResultSet
是否为空

或者(例如,当SQL可能返回或不返回
ResultSet
)时,您可以测试
query()
的结果,然后调用
getResultSet()
并测试其是否为空

为什么这里不假

根据javadoc:

返回:
true
如果第一个结果是
ResultSet
对象
false
如果第一个结果是更新计数或没有结果

在您的情况下,第一个结果将是
ResultSet
对象。空的
ResultSet
仍然是
ResultSet


在这种情况下(例如,当SQL是“选择”时),解决方案是使用
executeQuery
并使用`ResultSet.isBeforeFirst()测试
ResultSet
是否为空


或者(例如,当SQL可能返回或可能不返回
ResultSet
)时,您可以测试
query()
的结果,然后调用
getResultSet()
并测试它是否为空。

您使用了错误的条件语句,即使结果为空,查询也将执行,并且
ps.execute()
将返回
true

您使用了错误的条件语句,即使结果为空,查询也将执行,并且
ps.execute()
将返回
true


因此,无论您是否期望结果,对于select语句,execute()总是返回true

javadoc for execute:如果第一个结果是ResultSet对象,则为true;如果第一个结果是更新计数或没有结果,则为false

因此,无论您是否期望结果,对于select语句,execute()总是返回true

的返回值并不表示您认为它的含义:

返回:
true
如果第一个结果是
ResultSet
对象
false
如果第一个结果是更新计数或没有结果

SELECT
语句将始终生成一个
ResultSet
(即使结果中没有行)。相反,你应该

  • 使用从中获得的
    结果集
  • 检查的值以查看是否至少有一个结果
  • 的返回值并不表示您认为它的含义:

    返回:
    true
    如果第一个结果是
    ResultSet
    对象
    false
    如果第一个结果是更新计数或没有结果

    SELECT
    语句将始终生成一个
    ResultSet
    (即使结果中没有行)。相反,你应该

  • 使用从中获得的
    结果集
  • 检查的值以查看是否至少有一个结果
  • 检查从
    execute()
    返回的结果集的最简单方法是空的 检查从
    execute()
    返回的结果集的最简单方法是空的
    PreparedStatement.execute()的javadoc对返回值有什么看法?PreparedStatement.execute()的javadoc对返回值有什么看法?考虑到
    isbeforeforefirst()
    对于
    TYPE_uForward
    ResultSet是可选的,这不是最好的检查方法。仅检查对
    next()
    的第一次调用是否返回true是检查是否有结果的唯一保证方法。鉴于
    isBeforeFirst()
    对于
    TYPE\u FORWARD\u only
    resultset是可选的,这不是检查的最佳方法。仅检查对
    next()
    的第一次调用是否返回true是检查是否有结果的唯一保证方法。鉴于
    isBeforeFirst()
    对于
    TYPE\u FORWARD\u only
    resultset是可选的,这不是检查的最佳方法。仅检查对
    next()
    的第一次调用是否返回true是检查是否有结果的唯一保证方法。鉴于
    isBeforeFirst()
    对于
    TYPE\u FORWARD\u only
    resultset是可选的,这不是检查的最佳方法。仅检查对
    next()
    的第一次调用是否返回true是检查是否有结果的唯一保证方法。