在學習JSP開發時,遇到一個數據庫連接處理的問題。已經實現了用戶註冊功能,數據庫連接正常,插入數據成功。但當加入「判斷用戶名是否存在」的邏輯後,無論數據庫中是否存在該用戶名,頁面都只輸出「註冊失敗,用戶名不存在」。
<%
String uid = request.getParameter("uid");
String pwd = request.getParameter("pwd");
Object[] paramss = {uid, pwd};
String sqll = "insert into tb_vip values(?,?)";
if (DBHelper.runupdatesql(sqll, paramss)) {
out.print("已經成功註冊");
} else {
out.print("服務器問題請與客服聯系");
}
%>
<%
String uid = request.getParameter("uid");
String pwd = request.getParameter("pwd");
Object[] params = {uid};
String sql = "select count(*) from tb_vip where userid=?";
Result result = DBHelper.runselectsql(sql, params);
if (result.getRowCount() == 0) {
Object[] paramss = {uid, pwd};
String sqll = "insert into tb_vip values(?,?)";
if (DBHelper.runupdatesql(sqll, paramss)) {
out.print("已經成功註冊");
} else {
out.print("服務器問題請與客服聯系");
}
} else {
out.print("註冊失敗,用戶名已存在");
}
%>
public static Result runselectsql(String sql, Object[] params) {
Connection con = null;
PreparedStatement ps = null;
ResultSet res = null;
Result result = null;
try {
con = getConn();
ps = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
res = ps.executeQuery();
result = ResultSupport.toResult(res);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
res.close(); ps.close(); con.close();
} catch (Exception e) { e.printStackTrace(); }
}
return result;
}
runselectsql 返回的是 javax.servlet.jsp.jstl.sql.Result 對象,其 getRowCount() 方法在執行 SELECT COUNT(*) 時並不會返回計數值,而是返回結果集的行數(通常為 1)。因此判斷 result.getRowCount() == 0 永遠為假,導致進入 else 分支輸出「用戶名已存在」。
修改 runselectsql 方法,直接返回 int 類型的計數值,並在 JSP 中根據該值判斷。
public static int runselectsql(String uid) {
Connection con = null;
PreparedStatement ps = null;
ResultSet res = null;
int x = 0;
try {
con = getConn();
String sql = "select count(*) from tb_vip where userid=?";
ps = con.prepareStatement(sql);
ps.setString(1, uid);
res = ps.executeQuery();
while (res.next()) {
x = res.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
res.close(); ps.close(); con.close();
} catch (Exception e) { e.printStackTrace(); }
}
return x;
}
<%
String uid = request.getParameter("uid");
String pwd = request.getParameter("pwd");
if (DBHelper.runselectsql(uid) == 0) {
Object[] params = {uid, pwd};
String sql = "insert into tb_vip values(?,?)";
if (DBHelper.runupdatesql(sql, params)) {
out.print("已經成功註冊");
}
} else {
out.print("註冊失敗,用戶名已存在");
}
%>
通過將查詢方法改為直接返回計數值,避免了對 Result 對象行數的誤解,從而正確實現了用戶名唯一性檢查。這也提醒我們在使用 JSTL 的 Result 時需清楚其行為差異。