public String returnFirstName() throws SQLException {
String Username = username.getText();
String Password = String.valueOf(password.getPassword());
connection = DriverManager.getConnection(jdbcURL, user, SQLPassword);
statement = connection.createStatement();
try {
resultSet = statement.executeQuery("SELECT * FROM users WHERE username="
+ "'" + Username + "'" + " AND password=" +
"'" + Password + "'" + ";");
FirstName = resultSet.getString("first_name");
} catch (Exception exception) {
error = true;
exception.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
if (error) System.out.println("Error");
}
return FirstName;
}
您好,所以我遇到了一个问题,我试图返回从数据库中获取的值,但firstname的值为空,try块中的语句无效。是否有任何方法返回值,逻辑在try块中。(firstname变量已声明)有人能帮我吗?提前感谢!
如果first_name
列存在,resultSet.getString()
将不会引发NullPointerException。
对此,一个可能的解决方案是:
FirstName = resultSet.getString("first_name");
if (FirstName == null) {
throw new NullPointerException();
}
我还强烈建议更改您编写查询的方式。使用准备好的语句,因为当前的方法使您的数据库容易受到注入攻击。
准备好的语句是通过绑定变量为用户输入提供占位符的SQL语句。当执行该语句时,将单独提供用户输入,以确保数据库不会被诱骗以代码形式执行用户输入。
这是您查询的部分实现,其余的我将留给您弄清楚:
PreparedStatement preparedStatement = connection.prepareStatement(
"SELECT * FROM users WHERE username=?");
prep.setString(1, Username);
return preparedStatement.executeQuery();
处理数据库错误的正确方法是…根本不捕捉它。
请注意这一行的最后两个关键字:
public String returnFirstName() throws SQLException {
抛出SQLException
部分意味着您不必在代码中捕获任何异常。throws
子句告诉任何调用代码,如果数据库检索因任何原因失败,它必须决定要做什么。这是一件好事。这就是应用程序的编写方式。
这也意味着您不需要catch
块。事实上,如果您将连接和语句放在try-with-资源语句中,您也可以删除最后
块:
public String returnFirstName() throws SQLException {
String Username = username.getText();
String Password = String.valueOf(password.getPassword());
try (Connection connection = DriverManager.getConnection(jdbcURL, user, SQLPassword);
Statement statement = connection.createStatement()) {
ResultSet resultSet = statement.executeQuery("SELECT * FROM users WHERE username="
+ "'" + Username + "'" + " AND password=" +
"'" + Password + "'" + ";");
return resultSet.getString("first_name");
}
}
通过在<code>try</code>之后的括号内声明Connection和Statement对象,我们告诉Java在<code<try<-code>块结束时自动关闭它们。如果代码成功完成,或者发生异常,都会发生这种情况。(当相应的语句关闭时,ResultSet将自动关闭。)
与其试图忽略异常并为firstName选择一些“特殊”值,不如让调用代码决定在无法检索到值时要做什么。这允许您的方法每次都可靠地返回一个有效值。如果发生错误,该方法根本不会返回;相反,它将传播底层SQLException。调用方法的代码可以确定,如果返回了值,则该值是有效值。
(我故意不在这里讨论安全问题,例如SQL注入和未加密密码,因为这似乎是一项任务或练习,安全问题将超出范围。)