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

标签 java mysql swing stored-procedures

我在 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/

相关文章:

javascript - mysql 的输出不会在表上正确显示

MySQL 分解 Group By 结果以向分组添加更多详细信息

java - 如何使用 SwingWorker 和/或 Timer?

java - 如何创建一个简单的段落类

mysql - 将大型 MyISAM 表转换为 InnoDB

java - JButton 保持在中心的位置

java - 添加多个日志文件

java - 如何将数据从 Activity 传递到自定义适配器

java - Spring 安全配置 Kotlin DSL

java - Bitbucket 管道找不到 Gradle