有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

准备好的语句Java分配不起作用

我有一个功能,允许用户在用户类中登录系统。登录后——从数据库中检索他们的名字和姓氏,并将其作为私有变量存储在用户类中

private String username = "";
private String forename = "";
private String surname = "";

public User(){}

public boolean loginButtonAction(String user, String pass) {
    try {
        String statement = "SELECT PUNAME, PPASS, PFNAME, PSNAME FROM APP.PERSON WHERE PUNAME = ? AND PPASS = ?";
        PreparedStatement ps = Main.getPreparedStatement(statement);
        ps.setString(1, user);
        ps.setString(2, pass);
        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
            System.out.println("Logged in");
            username = user;
            forename = rs.getString("PFNAME");
            surname = rs.getString("PSNAME");
            return true;
        }
        rs.close();
        ps.close();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    System.out.println("Incorrect login details");
    return false;
}

我的用户类中有公共方法来返回这些变量

public String getUsername() {
    return username;
}

public String getForename() {
    return forename;
}

public String getSurname() {
    return surname;
}

我正在我的主类和方法中创建一个新的User实例,用于测试目的,并在成功登录后简单地打印用户的名字和姓氏,当然:

User u = new User();
u.loginButtonAction("johnny", "arsenal");
System.out.println("Forename: " + u.getForename());

用户名工作正常,但当然不能从数据库中提取。结果如下:

run:
Logged in
Forename: 

以下是我在应用程序中的数据库值。人员:

enter image description here

我做错了什么


共 (1) 个答案

  1. # 1 楼答案

    在调试方面,您应该做的第一件事是替换:

    forename = rs.getString("PFNAME");
    

    与:

    forename = rs.getString("PFNAME");
    System.out.println ("forename set to [" + forename + "]");
    

    这将告诉您在forname中放置的位置是什么

    如果为空,则问题在于数据库中的数据


    而且,根据您最近的更新,johnny/arsenalPFNAMEPSNAME列确实是空的

    看来你的代码运行得很好,只是你的数据库没有像你预期的那样被填充

    select是区分大小写的,所以johnny/arsenalJohnny/arsenal之间有区别。也许您认为您需要大写变体,在这种情况下,您应该使用:

    u.loginButtonAction("Johnny", "arsenal");