You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让JavaFX应用中修改MySQL用户状态的方法正常工作?

解决用户状态切换方法的问题

我帮你找出了几个导致grantAdminRights方法失效的关键问题,下面是修正方案和详细说明:

核心问题分析

  • SQL语句错误:你在SQL字符串里直接拼接了selectedUserID,但又调用了ps.setInt(1, selectedUser.getUserID()),这会造成参数索引越界异常——因为你的SQL里没有?占位符,JDBC找不到要填充的参数位置。
  • UI未刷新:修改数据库后,没有更新表格的数据源,导致界面上的状态不会同步变化。
  • 资源未正确关闭:Connection和PreparedStatement没有关闭,可能导致数据库连接泄漏。
  • 空指针风险:没有判断selectedUser是否为null,当用户没选中任何行时会抛出异常。

修正后的完整代码

private void grantAdminRights() {
    admninrightsButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent admnrights) {
            // 先判断是否选中用户
            User selectedUser = userTable.getSelectionModel().getSelectedItem();
            if (selectedUser == null) {
                System.out.println("请先选中一个用户");
                return;
            }
            
            Integer selectedUserID = selectedUser.getUserID();
            String currentStatus = selectedUser.getStatus();
            String targetStatus = "user".equals(currentStatus) ? "admin" : "user";
            
            // 使用try-with-resources自动关闭资源
            try (Connection con = DbUtil.getInstance().getConnection();
                 PreparedStatement ps = con.prepareStatement(
                     "UPDATE `androidshop`.`userdatabase` SET `status`=? WHERE `userID`=?")) {
                
                // 设置SQL参数
                ps.setString(1, targetStatus);
                ps.setInt(2, selectedUserID);
                int affectedRows = ps.executeUpdate();
                
                if (affectedRows > 0) {
                    // 更新内存中的User对象状态
                    selectedUser.setStatus(targetStatus);
                    // 刷新表格UI,让变化立刻显示
                    userTable.refresh();
                    System.out.println("用户状态已切换为:" + targetStatus);
                } else {
                    System.out.println("未找到对应ID的用户,更新失败");
                }
                
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("数据库更新出错:" + e.getMessage());
            }
        }
    });
}

关键修改点说明

  • 修复SQL参数问题:改用?占位符,通过ps.setString和ps.setInt安全设置参数,既避免SQL注入风险,又解决了参数索引越界的问题。
  • 增加空判断:先检查是否选中用户,防止空指针异常。
  • 自动关闭资源:使用try-with-resources语法,确保Connection和PreparedStatement在代码块结束后自动关闭,避免连接泄漏。
  • 刷新UI:调用userTable.refresh()让表格立刻显示更新后的状态,保证界面和数据同步。
  • 简化逻辑:用三元运算符简化状态切换的判断,让代码更简洁易读。
  • 增加更新结果校验:通过executeUpdate()返回的受影响行数判断更新是否成功,方便排查问题。

另外,建议把User类的属性改成私有,保持现有的getter/setter(当前属性是public,虽然能工作,但不符合Java封装规范)。

内容的提问来源于stack exchange,提问作者darkmatter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:57:40