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

时间:2013-08-18 16:36:00

标签: java sql jdbc null resultset

我有一个非常基本的代码执行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())来检查吗?

3 个答案:

答案 0 :(得分:9)

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

  

退货:

     
      
  • 一个ResultSet对象,包含给定查询生成的数据; 永不归零
  •   

强调我的。

  

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

答案 1 :(得分:5)

不,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());

答案 2 :(得分:2)

除非:

,否则结果集不会为空
  

1.它被初始化为null并且不执行任何其他操作,

     

2.如果写入执行查询的语句不正确(将发生sql异常并且不会进行初始化)。

这与这个问题无关,但会像我这样的人提示。

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

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

  

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

此错误是在20000次迭代后引起的),这会导致不需要的结果。