Java分配不起作用

时间:2013-02-27 00:59:41

标签: java prepared-statement variable-assignment resultset

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

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;
}

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

public String getUsername() {
    return username;
}

public String getForename() {
    return forename;
}

public String getSurname() {
    return surname;
}

我正在我的Main类和方法中创建一个User的新实例,用于测试目的,并且在成功登录之后只需打印用户的姓名和姓氏:

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

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

run:
Logged in
Forename: 

以下是APP.PERSON中的数据库值:

enter image description here

我做错了什么?

2 个答案:

答案 0 :(得分:3)

在调试方面,你要做的第一件事就是替换:

forename = rs.getString("PFNAME");

使用:

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

这将告诉你forname放置在那里的位置。

如果这是空白的,那么问题在于数据库中的数据。


根据您的最新更新,PFNAME的{​​{1}}和PSNAME列确实是空白。

所以看起来你的代码工作正常,只是你的数据库没有像你期望的那样填充。

johnny/arsenal区分大小写,因此selectjohnny/arsenal之间存在差异。也许你认为你想要大写的变体,在这种情况下你应该使用:

Johnny/arsenal

答案 1 :(得分:1)

您的数据库中有两个值。一个有首都约翰尼,一个有小写约翰尼。

您正在查询小写的johnny,它没有PFNAME或PSNAME值。

在查看代码之前,始终尝试测试SQL。