Java - 无法从MySQL StoredProcedure返回/访问ResultSet

时间:2015-08-20 23:42:55

标签: 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语句

感谢您现在的支持和意见。

1 个答案:

答案 0 :(得分:1)

很难说你的代码究竟出了什么问题,因为如果你选择使用存储过程执行这个简单的任务,那么失败有很多可能的点(程序中的语法不正确,获取的问题) 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声明的。
  • 该方法现在返回一个布尔值,该布尔值对应于凭证是否有效,从而可以更容易地使用调用代码。
  • 无法处理的例外情况(例如SQLException)会被重新引用为RuntimeExceptions(而不是仅仅在空catch块中吞下它们)。
    • 基本上,当抛出SQLException时,代码中存在编程错误(无效的查询语法)或​​数据库严重错误。在任何一种情况下,唯一的选择通常是停止你的程序。如果您想要处理调用方法中的情况,可以在方法签名中声明throws SQLException

最后,需要提到的是,绝不应将密码作为纯文本存储在数据库中,以避免对db具有读访问权限的任何人以任意用户身份登录。相反,你应该存储密码哈希,甚至更好的盐渍哈希。更多关于此事在Best way to store password in database