gpt4 book ai didi

Java - 无法从 MySQL StoredProcedure 返回/访问结果集

转载 作者:行者123 更新时间:2023-11-28 23:53:51 26 4
gpt4 key购买 nike

我在 MySQL 中有用户表,我创建了一个存储过程,以便在从 swing 文本字段获取用户名和密码时将它们传递到存储过程中,并了解是否存在要登录的用户,但我实际上无法在 phpMyAdmin 中获取结果集存储过程正常工作,但在 netbeans 中无法获取结果集,并且运行时永远不会在控制台中停止,始终运行。

我不认为我的代码在其他地方有问题,因为它是非常简单的代码。

这是我在 MySQL 中的存储过程

SELECT * FROM `users` WHERE `users`.`E-Mail` = @p0 AND `users`.`Password` = @p1

它需要两个参数 varchar,我之前尝试过将它们作为文本

这是我的java代码的具体部分

     public void loginPass(String email, String password){

try {
DriverManager.registerDriver((Driver) Class.forName("com.mysql.jdbc.Driver").newInstance());
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/askdocdb","root","");
CallableStatement mystatement = connection.prepareCall("{CALL sp_Login (?, ?)}");
mystatement.setString(1, email);
mystatement.setString(2, password);

// mystatement.setString("@p0", email);
// mystatement.setString("@p1", password);


boolean situation = mystatement.execute();
System.out.println(situation);
// resultset = mystatement.executeQuery();
resultset = mystatement.getResultSet();

String res = resultset.getString(2);
System.out.println(res);

// resultset = mystatement.executeQuery();
while(resultset.next()){
System.out.println("asdsad");
}
resultset.close();

} catch (Exception e) {
}
}

注释行的原因,我尝试了任何可能的语法组合

情况返回真

res不返回

并且不能进入while语句

感谢您现在的支持和评论。

最佳答案

很难说您的代码到底出了什么问题,因为如果您选择为这个简单的任务使用存储过程,则有很多可能的失败点(过程中的语法不正确,获取返回值的问题) JDBC 等)。我会简单地通过 JDBC 运行 SQL 查询来检查凭据:

public void registerDriver() {
try {
DriverManager.registerDriver((Driver) Class.forName(
"com.mysql.jdbc.Driver").newInstance());
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException | SQLException e) {
throw new RuntimeException("Could not register MySQL driver!", e);
}
}

public boolean checkLogin(String email, String password) {

try (Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/askdocdb", "root", "");
PreparedStatement ps = connection
.prepareStatement("SELECT 1 FROM users WHERE "
+ "E-Mail = ? AND Password = ?")) {

ps.setString(1, email);
ps.setString(2, password);

try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return true; // username and password match
} else {
return false; // no row returned, i.e. no match
}
}
} catch (SQLException e) {
throw new RuntimeException(
"Error while checking user credentials!", e);
}
}

改变了什么:

  • JDBC 驱动程序注册已被提取到一个单独的方法 (registerDriver()) 中,您只需调用一次(例如,在程序启动后),而不是每次检查凭据时调用。
  • ConnectionPreparedStatementResultSet 等资源现在可以正确关闭(即使抛出异常),因为它们是通过声明的the try-with-resources statement .
  • 该方法现在返回一个与凭据是否有效相对应的 boolean 值,使其更易于通过调用代码使用。
  • 无法处理的异常(例如 SQLException)将作为 RuntimeExceptions 重新抛出(而不是将它们吞入空的 catch block 中)。
    • 基本上,当抛出 SQLException 时,要么是代码中存在编程错误(无效的查询语法),要么是数据库存在严重错误。在任何一种情况下,唯一的选择通常是停止您的程序。如果您想改为在调用方法中处理这种情况,您可以在方法签名中声明 throws SQLException

最后,需要提及的是,您永远不应将密码以纯文本形式存储在数据库中,以避免任何对数据库具有读取权限的人以任意用户身份登录。相反,您应该存储密码哈希,或者更好的是,加盐的哈希。有关此的更多信息,例如在 Best way to store password in database .

关于Java - 无法从 MySQL StoredProcedure 返回/访问结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com