錯誤代碼
String sql = "SELECT count(*) FROM 表名 WHERE name='" + username + "'";
ResultSet rs = stmt.executeQuery(sql);
if (rs == null) { // 錯誤:ResultSet 永不為 null
System.out.print("未註冊");
addData();
} else {
System.out.print("已註冊");
}
問題分析
executeQuery 返回的 ResultSet **永遠不為 null**,即使查無記錄也返回空游標。
SELECT COUNT(*) 總會返回一行(計數值),故 rs.next() 必為 true。
- 應判斷計數值是否為 0。
修正代碼
String sql = "SELECT COUNT(*) FROM 表名 WHERE name = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
int count = rs.getInt(1);
if (count == 0) {
System.out.println("未註冊");
addData();
} else {
System.out.println("已註冊");
}
} else {
System.out.println("查詢異常:無結果集");
}
進階建議
- 使用
PreparedStatement 防 SQL 注入。
- 若僅需存在性判斷,可改
SELECT 1 FROM 表名 WHERE name = ? LIMIT 1,配合 rs.next() 直接判斷,避免全表掃描計數。
- 關閉資源用 try-with-resources(JDK 7+):
try (PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
// ...
}