Java While循环条件校验异常:重复Rank仍被插入问题求助
问题分析与解决方案
核心问题
- 语法错误:
if语句未闭合},导致else作用域混乱,即便触发重复提示,后续插入逻辑仍会执行 - 逻辑错误:在
while(rs.next())循环内直接处理else插入,只要循环中某条记录不匹配目标职级,就会执行插入,而非等所有记录检查完毕确认无重复再操作 - SQL注入风险:原查询用字符串拼接构造SQL,存在安全隐患
修正后的代码
// 用参数绑定重构查询SQL,避免注入 String valChecker = "SELECT * FROM `committee_memba` WHERE (Rank = ? OR Rank = ?) AND committee_name = ?"; PreparedStatement stmt = conn.prepareStatement(valChecker); stmt.setString(1, "Chairperson"); stmt.setString(2, "Vice-Chair"); stmt.setString(3, jComboBox1.getSelectedItem().toString()); ResultSet rs = stmt.executeQuery(); boolean rankExists = false; // 标记目标职级是否已存在 while (rs.next()) { String rnk = rs.getString("Rank"); System.err.println(rnk); // 找到匹配职级,标记为已存在并跳出循环 if ((rnk.equals("Chairperson") && rank.equals("Chairperson")) || (rnk.equals("Vice-Chair") && rank.equals("Vice-Chair"))) { rankExists = true; break; } } // 循环结束后统一判断是否执行插入 if (rankExists) { JOptionPane.showMessageDialog(rootPane, "Your Rank, " + rank + " already Exist, please review your membership or remove "+rank+" before adding another"); } else { pst.setString(3, rank); pst.execute(); JOptionPane.showMessageDialog(this, "Saved, OK"); } // 关闭资源(避免内存泄漏) rs.close(); stmt.close();
关键修正点
- 新增
rankExists标记变量,循环仅负责检测重复职级,不直接处理插入逻辑 - 循环结束后根据标记统一判断:存在重复则提示,不存在才执行插入
- 重构查询SQL为参数绑定形式,彻底避免SQL注入风险
- 补全语法结构,确保代码逻辑作用域正确
内容的提问来源于stack exchange,提问作者janet
相关产品推荐
相关产品推荐

