JavaFX+MySQL学生登录方法失效,始终提示凭据错误
问题分析与修复
你的代码核心逻辑完全搞反了:resultSet.isBeforeFirst()返回true的时候,说明SQL查询到了匹配的记录(结果集不为空),但你现在的代码一查到记录就弹"Wrong credentials"错误,这就是为什么每次都弹出这个提示的原因。
另外还有几个额外问题:
- 邮箱作为登录标识应该是唯一的,不需要用
do-while循环遍历结果集,查一次就够了 - 没有正确关闭数据库连接、Statement和ResultSet,容易导致资源泄漏
- 密码匹配失败时没有给出对应提示
修复后的代码如下:
public static void studentSignIn(ActionEvent event, String email, String password) { // 使用try-with-resources自动关闭资源 try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/compsciia", "root", "toor"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT password FROM students WHERE email = ?")) { preparedStatement.setString(1, email); try (ResultSet resultSet = preparedStatement.executeQuery()) { // 检查是否有匹配的记录 if (!resultSet.isBeforeFirst()) { // 没有找到对应邮箱的用户 Alert alert = new Alert(Alert.AlertType.ERROR); alert.setContentText("该邮箱未注册"); alert.show(); return; } // 因为邮箱唯一,直接取第一条记录 resultSet.next(); String retrievedPassword = resultSet.getString("password"); if (retrievedPassword.equals(password)) { sceneChange(event, "StudentPage.fxml", email); } else { // 密码不匹配 Alert alert = new Alert(Alert.AlertType.ERROR); alert.setContentText("密码错误"); alert.show(); } } } catch (SQLException e) { // 处理数据库异常 Alert alert = new Alert(Alert.AlertType.ERROR); alert.setContentText("数据库连接失败:" + e.getMessage()); alert.show(); e.printStackTrace(); } }
关键修复点:
- 反转
isBeforeFirst()的判断逻辑:当结果集为空(!resultSet.isBeforeFirst())时,才提示邮箱未注册 - 使用
try-with-resources语法,自动关闭Connection、PreparedStatement和ResultSet,避免资源泄漏 - 去掉多余的循环,因为邮箱唯一,只需读取一条记录
- 区分“邮箱不存在”和“密码错误”两种错误提示,更友好
- 添加异常捕获,处理数据库连接等异常情况
内容的提问来源于stack exchange,提问作者oi_amigo
相关产品推荐
相关产品推荐

