public boolean login(String b_username,String b_password){ Connection conn = null; PreparedStatement pstm = null; ResultSet rs = null; ArrayList<Buyerobj> list = new ArrayList<Buyerobj>(); // 2、获取链接 conn = c3p0.getConnection();// 搭了一座桥 // 3、准备sql语句 String selectUsername = "SELECT * FROM buyer WHERE b_username=? AND b_password=? "; System.out.println(b_username+" "+b_password); try { // 创建PreparedStatement对象并设置参数 pstm = conn.prepareStatement(selectUsername); pstm.setString(1, b_username); pstm.setString(2, b_password); // 执行查询操作并获取结果集 rs = pstm.executeQuery(); System.out.println(rs.next()); // 判断是否登录成功 if (rs.next()) { return true; } } catch (Exception e) { e.printStackTrace(); } return false; } 改错
时间: 2024-02-10 17:12:22 浏览: 22
代码中存在两个问题:
1. 在代码中已经执行了 `rs.next()` 方法,再次执行时会将结果集游标下移,因此在 `if (rs.next())` 中判断登录成功的代码永远不会被执行。应该将第一个 `rs.next()` 的结果保存到一个布尔变量中,再进行判断。
2. 在代码中使用了 c3p0 连接池,但是在方法中没有对连接、语句和结果集进行关闭操作,可能会导致连接池的连接被耗尽。需要在 try-catch-finally 中进行关闭操作。
修改后的代码如下:
```
public boolean login(String b_username, String b_password) {
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
boolean success = false;
try {
// 2、获取链接
conn = c3p0.getConnection();// 搭了一座桥
// 3、准备sql语句
String selectUsername = "SELECT * FROM buyer WHERE b_username=? AND b_password=? ";
System.out.println(b_username + " " + b_password);
// 创建PreparedStatement对象并设置参数
pstm = conn.prepareStatement(selectUsername);
pstm.setString(1, b_username);
pstm.setString(2, b_password);
// 执行查询操作并获取结果集
rs = pstm.executeQuery();
// 判断是否登录成功
if (rs.next()) {
success = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接、语句和结果集
try {
if (rs != null) {
rs.close();
}
if (pstm != null) {
pstm.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return success;
}
```