我有这样的方法。为什么当我设置不在数据库中的登录名时总是得到真?
public boolean isLoginFree(String login) {
String loginfree = null;
try {
PreparedStatement pst = null;
pst = con.prepareStatement("SELECT login from User where login = ?");
pst.setString(1, login);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
logintemp = rs.getString("login");
if ((logintemp.equals(login) == true)) {
return false; //login free
}
}
} catch (Exception e) {
System.err.println(e);
}
return true; //login busy
}
出现异常,或者未从while
循环返回,则始终执行方法底部的return true
行。
只有一个出口点会更直接。 在方法中设置一个布尔变量,并且仅在循环中发生积极的事情时才设置它。 这意味着在循环中引入break
。
下面是一个示例。
public boolean isLoginFree(String login) {
boolean result = false;
String loginfree = null;
try {
PreparedStatement pst = null;
pst = con.prepareStatement("SELECT login from User where login = ?");
pst.setString(1, login);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
logintemp = rs.getString("login");
if ((logintemp.equals(login)) {
result = true;
break;
}
}
} catch (Exception e) {
System.err.println(e);
}
return result;
}
编辑:如果您希望查询检查数据库中是否存在该值,那么您确实需要一个NOT EXISTS
查询。
SELECT 1 from User WHERE NOT EXISTS(SELECT * from User WHERE login = ?);
然后,您可以改用getBoolean(0)
的结果。
如下所示:
public boolean isLoginFree(String login) {
boolean result = true;
try {
PreparedStatement pst = null;
pst = con.prepareStatement("SELECT 1 from User WHERE NOT EXISTS(SELECT * from User WHERE login = ?)");
pst.setString(1, login);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
if (rs.getBoolean(0)) {
result = false;
break;
}
}
} catch (Exception e) {
System.err.println(e);
}
return result;
}
理解正确,您想要的是查看login
值是否已存储在数据库中。更简单的方法:
public boolean isLoginFree(String login) throws SQLException {
PreparedStatement pst = con.prepareStatement("select login " +
"from User " +
"where login=?");
pst.setString(1, login);
ResultSet rs = pst.executeQuery();
return !rs.first();
}
如果结果集中(至少)有一行(即登录名已存储在表中),这将返回false
,否则true
。
如果你想使用"漫长的方式"来做到这一点:
public boolean isLoginFree(String login) {
boolean ans = false;
try(PreparedStatement pst = con.prepareStatement("select login " +
"from User " +
"where login = ?")) {
pst.setString(1, login);
try(ResultSet rs = pst.executeQuery()) {
ans = !rs.first();
} catch(SQLException e) {
// Handle the exeption for the result set
}
} catch(SQLException e) {
// Handle the exeption for the prepared statement
}
return ans;
}
在这两种情况下,如果结果集中没有行,函数应该返回true
(这就是!
的原因:如果值已经存在,那么它就不是免费的,所以结果应该是假的......至少我是这么看的)。