ResultSet 可以在 Java 中'null'吗?



我有一段非常基本的代码,它执行选择查询并返回布尔值,具体取决于结果集是否为空。

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())进行检查吗?

您本可以查看Statement#executeQuery()方法的API。上面写着:

退货:

  • ResultSet对象,其包含由给定查询产生的数据从不为空

强调我的。

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

是的。

否,executeQuery(java.lang.String)方法返回的ResultSet不能为null。

此外,检查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());

结果集不会为空,除非:

1.它被初始化为空,没有做任何其他事情,

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

这与这个问题无关,但对像我这样的人来说是一个提示

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

我遇到了这个错误,这就是我写作的原因。当我们进行批量处理时,50000次执行中有一次会导致异常,这可能是一个很大的问题(在我的例子中:

com.ibm.db2.jcc.a.SQL异常:db2 SQL错误:SQLCODE:-805,SQLSTATE:5102

这个错误是在大约20000次迭代中引起的),这导致了不想要的结果。

相关内容

  • 没有找到相关文章

最新更新