【问题标题】:JDBC try block does not executeJDBC try 块不执行
【发布时间】:2018-10-22 16:59:33
【问题描述】:

所以问题是 Try 块代码不执行,我该怎么办?问题出在哪里?

public class verif {
    public static String checki(String pseudo, String mdp) {
        boolean check = false;
        String psDB = "", passDB = "";
        Connection con = null;
        PreparedStatement stmt;
        ResultSet res;
        try {

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/hotel", "naila", "pass");
            stmt = con.prepareStatement("select pseudo,mdp from recp");
            res = stmt.executeQuery();
            while (res.next()) {
                psDB = res.getString("pseudo");
                passDB = res.getString("mdp");
            }

            boolean us = psDB.equals(pseudo);
            boolean ps = passDB.equals(mdp);
            if (us && ps)
                check = true;
            else
                check = false;
        } catch (ClassNotFoundException | SQLException e) {
        }
        return psDB;
    }
}

这是servlet:

 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pseudo=request.getParameter("username");
    String mdp = request.getParameter("password");
    PrintWriter p = response.getWriter();
    p.print("pseudo est "+verif.checki(pseudo, mdp));
  }

【问题讨论】:

  • 您的代码中有两个Connection 对象(cocon),而您使用的是null ...
  • 你没有移动光标你必须调用res.next()尝试使用if(res.next()){psDB=res.getString(1).toString(); passDB=res.getString(2).toString();}
  • 他们在哪里?
  • 除了recp.hotel 是什么意思schema.tablename?或者到底是什么?
  • 好的,请尝试在 catch 块中使用e.printStackTrace(); 可能有错误

标签: java mysql servlets jdbc prepared-statement


【解决方案1】:
Connection con = null;
Connection co=DriverManager.getConnection("jdbc:mysql://localhost:3306/hotel" ,"naila","pass"); 

您声明了这 2 个连接,但在您准备好的语句中使用:

stmt = con.prepareStatement("select pseudo,mdp from recp.hotel");

只需删除 con 并使用 co 就可以了

此外,当您执行准备好的语句时,您会得到一个游标。并且该光标需要移动到下一个位置。 例如,如果您认为会返回多条记录,请执行以下操作:

while(rs.next()){  
  psDB=res.getString("pseudo");
  passDB=res.getString("mdp");
}

【讨论】:

  • 我改了,还是一样的问题
  • 是伪的,mdp 代表我的专栏?
  • 是的,您可以使用列名
【解决方案2】:

您只是忘记在ResultSet res 上调用next() 以将ResultSet 的光标指向第一条记录(如果有的话)。如果您没有调用next 方法,那么该光标将指向第一个结果记录之前,然后res.getString(#) 将不会返回任何内容。

这样做:

.
.
.
res = stmt.executeQuery();
while(res.next()){
    psDB = res.getString(1).toString();
    passDB = res.getString(2).toString();
}
.
.
.

另一个提示是调用res.getString(#) 将返回String 类型的值,无需再次调用.toString()。所以最好改成这样:

.
.
.
res = stmt.executeQuery();
while(res.next()){
    psDB = res.getString(1);
    passDB = res.getString(2);
}
.
.
.

在这种情况下,最好将 sql 的结果尽可能缩小到只有一条记录(检查用户名和密码以进行登录等)。这意味着只选择传递给checki 方法的用户名的密码:

.
.
.
stmt = con.prepareStatement("select pseudo, mdp from recp where pseudo = ? ");
stmt.setString(1, pseudo);
res = stmt.executeQuery();
while(res.next()){
    psDB = res.getString(1);
    passDB = res.getString(2);
}
.
.
.

如果您在此之后有任何其他错误,您可以检查您的表中有多少条记录,并检查您在代码中选择的记录是否存在。

这可能是因为您的代码中的某些异常被catch 子句捕获,但由于您在catch 子句中没有执行任何操作,因此无法发出任何信号通知您。像这样更改您的 catch 子句以查看是否发生任何异常:

}catch (ClassNotFoundException | SQLException e) {
    e.printStackTrace();
}

【讨论】:

  • 我只是试了一下,还是有同样的问题
  • 您的recp 表中有多少条记录?您确定所有记录的 pseudomdp 列都不为空吗?因为您正在选择 recp 表的所有记录。
  • 刚刚更新了我的答案。检查您的recp 表并使用某些工具(如 MySQL 查询浏览器或其他工具)手动查找具有特定pseudo 的记录。如果你确定你有你正在寻找的记录,然后检查可能发生的任何异常。
  • 谢谢问题出在 mysql 连接器上!
  • 很高兴有帮助。通常,当答案解决了问题或帮助您找到它时,您可能希望将其标记为问题的答案。这也有助于其他人为他们的类似情况找到解决方案。
【解决方案3】:

你的代码应该是这样的。

public class verif {
    public static boolean checki(String pseudo, String mdp) {
        boolean check = false;
        String psDB = "", passDB = "";
        Connection con = null;
        PreparedStatement stmt;
        ResultSet res;
        try {

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/hotel", "naila", "pass");
            stmt = con.prepareStatement("select pseudo,mdp from recp where pseudo=? AND mdp=?");
            stmt.setString(pseudo);
            stmt.setString(mdp);

            res = stmt.executeQuery();
           /* Not  Needed
         while (res.next()) {
                psDB = res.getString("pseudo");
                passDB = res.getString("mdp");
            }

            boolean us = psDB.equals(pseudo);
            boolean ps = passDB.equals(mdp);*/
            if (res.next())
                check = true;
            else
                check = false;
        } catch (Exception e) {
              e.printStackTrace();
        }
        return check;
    }
}

而Servlet端的代码应该是这样的。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{   
    String pseudo=request.getParameter("username");
    String mdp = request.getParameter("password");
    PrintWriter p = response.getWriter();
    if(verif.checki(pseudo, mdp)){
        // Put your Business Logic (Create session and redirect to Main Page)
        p.print("Successfully Logged in");
    }
    else{
        // Redirect to LogIn page
        p.print("Invalid Credential ");
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 2019-07-30
    • 2022-11-02
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多