我有一个允许用户在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中的数据库值:
我做错了什么?
答案 0 :(得分:3)
在调试方面,你要做的第一件事就是替换:
forename = rs.getString("PFNAME");
使用:
forename = rs.getString("PFNAME");
System.out.println ("forename set to [" + forename + "]");
这将告诉你forname
放置在那里的位置。
如果这是空白的,那么问题在于数据库中的数据。
根据您的最新更新,PFNAME
的{{1}}和PSNAME
列确实是空白。
所以看起来你的代码工作正常,只是你的数据库没有像你期望的那样填充。
johnny/arsenal
区分大小写,因此select
和johnny/arsenal
之间存在差异。也许你认为你想要大写的变体,在这种情况下你应该使用:
Johnny/arsenal
答案 1 :(得分:1)
您的数据库中有两个值。一个有首都约翰尼,一个有小写约翰尼。
您正在查询小写的johnny,它没有PFNAME或PSNAME值。
在查看代码之前,始终尝试测试SQL。