我有一个非常基本的代码执行一个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 回答
您可以查看Statement#executeQuery()方法的API . 它说:
强调我的 .
是 .
不,executeQuery(java.lang.String)方法返回的ResultSet可以 never be null .
此外,检查ResultSet是否为空的标准方法是尝试使用
first()
将其光标设置为第一行,如果返回false,则表示ResultSet为空 .所以,在你的情况下你甚至不需要检查
return rs.first();
例如:
除非符合以下条件,否则结果集将不为空:
这与这个问题无关,但会像我这样的人提示 .
当数据库操作在一个单独的类中完成时会发生这种情况,其中在try-catch中给出了statement.executeQuery(),它没有e.printStackTrace()或任何其他日志记录机制 .
我遇到了这个错误,这就是我写作的原因 . 当我们进行批处理时,这可能是一个很大的问题,其中50000执行中的一个导致异常(在我的情况下:
这个错误是在20000次迭代引起的,这会导致不必要的结果 .