Java中的ResultSet可以为“null”吗?

3

我有一段非常基础的代码,执行一个select查询并根据结果集是否为空返回一个布尔值。

public boolean checkIfUserHasPreferences(String username){
        ResultSet rs = null;
        boolean checkBoolean = false;

        try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            con = DriverManager.getConnection(Messages.getString("OracleUserManagement.0"), Messages.getString("OracleUserManagement.1"), Messages.getString("OracleUserManagement.2")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

            PreparedStatement statement = con.prepareStatement("SELECT USERNAME FROM USER_PREFERENCES WHERE USERNAME = ?"); 
            statement.setString(1, username);
            rs = statement.executeQuery();
            if (rs == null){
                System.out.println("I checked it was true!");
                checkBoolean = true;
            } else {
                System.out.println("I checked it was false!");
                checkBoolean = false;
            }

            con.commit();

            con.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return checkBoolean;
    }

我感到困惑的是,即使表/数据库为空,它总是打印出"I checked it was false!"。这是因为结果集返回0行,也不等于null吗?我应该使用while(rs.next())来进行检查吗?
3个回答

11
您可以查看 Statement#executeQuery() 方法的API。它说:

返回值:

  • 包含给定查询产生的数据的 ResultSet 对象;从不为 null

以上是我强调的。

那我应该使用 while (rs.next()) 进行检查吗?

是的。


2
@oOTesterOo。当然。遇到问题时,你应该先访问API。那就是它们存在的目的。 - Rohit Jain

6

不,executeQuery(java.lang.String) 方法返回的 ResultSet 永远不会为空

此外,检查 ResultSet 是否为空的标准方法是尝试使用其 first() 将光标设置到第一行,如果返回 false,则表示 ResultSet 为空。

因此,在您的情况下,您甚至不需要检查,只需 return rs.first(); 即可。

例如:

if (!rs.first()) {
    // handle empty set: throw error or return
}

// continue processing the ResultSet further
do {
    // ...
} while (rs.next());

太多步骤了,只需检查rs.next(),然后处理游标即可。 - kidnan1991
1
@kidnan1991 这个解决方案可以让你处理当结果集为空时想要采取某些操作的情况。 - sactiw

2
结果集在以下情况下不会为空,直到出现以下情况之一:

1.它被初始化为null并且没有进行其他操作,

2.如果执行execute query的语句不正确(将发生sql异常,并且不会执行初始化)。

这与本问题无关,但将为像我这样的人提供提示。

当数据库操作在一个单独的类中完成时,其中statement.executeQuery()在try-catch中给定,该try-catch没有e.printStackTrace()或任何其他日志记录机制时,就会发生这种情况。

我曾经遇到过这个错误,这就是我写这篇文章的原因。当我们进行批处理时,如果50000个执行之一导致异常(在我的情况下是20000次迭代),这可能是一个大问题,从而导致意外结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接