Java中的ResultSet可以为"null"吗?

Dea*_*Iss 1 java sql null jdbc 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;
    }
Run Code Online (Sandbox Code Playgroud)

让我感到困惑的是,即使表/数据库是空的,它总是打印出"我检查它是假的!".

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

Roh*_*ain 9

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

返回:

  • 包含给定查询生成的数据的ResultSet对象; 永远不会

强调我的.

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

是.

  • @oOTesterOo.当然.出现问题时,您应首先访问API.这就是他们的目的. (2认同)

sac*_*tiw 6

不能,由executeQuery(java.lang.String)方法返回的ResultSet 永远不能为null

此外,检查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());
Run Code Online (Sandbox Code Playgroud)