我有一个连接到数据库后端的小型java项目。我有一个登录功能,但当我把它放入我的测试线束时,我无法让它在那里给我正确的输出。
public boolean validateLogin(User validate) {
{
Connection conn = null;
String dbUserName = "root"; // MySQL database username
String dbPassword = "nbuser"; // MySQL database password
boolean returnValue = false;
String dbUrl = "jdbc:mysql://localhost:3306/project";
try {
Class forNam = Class.forName("com.mysql.jdbc.Driver");
try {
forNam.newInstance();
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
}
} catch (ClassNotFoundException ex) {
}
try {
conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);
System.out.println("Database connection establish...!");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM login_register WHERE user_id='" + validate.getUserID() + "'");
if (rs.next()) {
if (rs.getString(2).equals(validate.getUserPassword())) {
System.out.println("User and Password Match");
} else {
System.out.println("No User Or Password Match");
}
}
else {
System.out.println("No User Or Password Match");
}
} catch (SQLException ex) {
System.out.println("Cannot connect to database server...!!");
} finally {
if (conn != null) {
try {
conn.close();
System.out.println("Database connection terminated...!!!");
returnValue = true;
} catch (SQLException ex) {
}
}
}
return returnValue;
}
}
现在我的测试代码,看看这个语句是否有效
User testLogin = new User();
testLogin.setUserID("userid");
testLogin.setUserPassword("password");
if (test.validateLogin(testLogin)) {
System.out.println("User logged in");
}
else {
System.out.println("Failed to login");
}
上面的两位信息都在我的数据库中,所以我在IDE中的输出如下:
Database connection establish...!
User and Password Match
Database connection terminated...!!!
User logged in
但如果我将值更改为不在数据库中的内容我
Database connection establish...!
No User Or Password Match
Database connection terminated...!!!
User logged in
所以问题是在我的测试代码中,当值不匹配时,我不能说它们不匹配,这是我以后在工作中需要的函数。
如果我的测试端的id和密码不匹配,我需要更改我的测试代码,以便说出"failed to login"
答案 0 :(得分:1)
试试这个
if (rs.getString(2).equals(validate.getUserPassword())) {
System.out.println("User and Password Match");
returnValue =true;
} else {
System.out.println("No User Or Password Match");
returnValue =false;
}
并从finally块
中删除returnValue =true;
答案 1 :(得分:1)
您的方法存在一些问题:
您应该将代码放在一个try / catch块中。放置它的方式,如果第一个try块中的代码Class forNam = Class.forName("com.mysql.jdbc.Driver");
失败,第二个仍然会执行,这将导致连接无法打开引起的异常。
您的finally()块确保该方法始终返回true。您应将returnValue = true;
块放在if (rs.getString(2).equals(validate.getUserPassword())) {
块内,以及“用户和密码匹配”方案。
答案 2 :(得分:0)
这是您遇到问题的一部分:
} finally {
if (conn != null) {
try {
conn.close();
System.out.println("Database connection terminated...!!!");
//delete the next line:
//returnValue = true; // <-- in a finally block, this will always run...
另外,我注意到,当应该将returnValue设置为true时,你没有将它设置为:
if (rs.next()) {
if (rs.getString(2).equals(validate.getUserPassword())) {
System.out.println("User and Password Match");
//add this line:
returnValue=true;
} else {
System.out.println("No User Or Password Match");
}
}
else {
System.out.println("No User Or Password Match");
}
答案 3 :(得分:0)
成功状态不依赖于“我可以连接到数据库”,但如果密码确实匹配则应该设置...
if (rs.next()) {
if (rs.getString(2).equals(validate.getUserPassword())) {
System.out.println("User and Password Match");
returnValue = true; // <---
} else {
System.out.println("No User Or Password Match");
}
}
else {
System.out.println("No User Or Password Match");
}
请勿在{{1}}子句中将值设置为true。