Java 结果集是否可以是';空';在爪哇?

Java 结果集是否可以是';空';在爪哇?,java,sql,jdbc,null,resultset,Java,Sql,Jdbc,Null,Resultset,我有一个非常基本的代码,它执行一个select查询并返回一个布尔值,这取决于结果集是否为空 public boolean checkIfUserHasPreferences(String username){ ResultSet rs = null; boolean checkBoolean = false; try { DriverManager.registerDriver(new oracle.jdbc.driver

我有一个非常基本的代码,它执行一个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;
    }
让我困惑的是,即使表/数据库是空的,它也总是打印出“我检查它是假的!”


这是因为即使结果集返回0行,它也不=null吗?我应该使用while(rs.next())来检查吗?

您可以查看方法的API。它说:

返回:

  • 包含给定查询生成的数据的ResultSet对象从不为空
我的

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


是。

否,executeQuery(java.lang.String)方法返回的结果集不能为空

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

因此,在您的情况下,甚至不需要检查,只需
返回rs.first()

例如:

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

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

结果集不会为空,除非:

1.初始化为null,不做任何其他操作

2.如果写入execute query的语句不正确(将发生sql异常且不会发生初始化)

这与这个问题无关,但可以作为像我这样的人的提示

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

我遇到了这个错误,这就是我写作的原因。当我们执行批处理时,如果50000次执行中有一次会导致异常(在我的情况下:

com.ibm.db2.jcc.a.SqlException:db2sql错误:SQLCODE:-805, SQLSTATE:51002


这个错误是由大约20000次迭代引起的,这会导致不必要的结果

@oOTesterOo。当然遇到问题时,您应该首先访问API。这就是他们的目的。步骤太多了,只需检查rs.next(),然后处理光标instead@kidnan1991该解决方案允许您处理希望对空resultset执行某些操作的场景