香薰蜡烛管理程序条件判断语句异常问题及代码求助
解决香薰蜡烛产品管理程序中香水名称重复检查的逻辑问题
嘿,我来帮你排查这个问题~从你贴的代码来看,有几个关键问题导致了条件判断异常,咱们一步步梳理:
1. SQL语句的语法错误
你写的SQL末尾多了一个分号:
sql = "SELECT Code_Parfum FROM T_Parfum WHERE Nom_Parfum = \"" + tbxPerfumeName.getText() + "\";;
这里最后两个分号会导致SQL执行报错,数据库无法正确解析这条语句,这可能是触发异常逻辑的根源之一,得改成一个分号。
2. 严重的SQL注入风险(同时也会引发语法问题)
直接把用户输入的文本拼接进SQL字符串是非常危险的操作,比如如果用户输入的香水名称里包含双引号,会直接破坏SQL语法,导致执行失败。必须改用PreparedStatement来参数化查询,这不仅能避免注入,还能自动处理字符串转义问题。
3. ResultSet游标使用逻辑错误
你先调用了System.out.println(!rs.next());,这已经移动了ResultSet的游标:
- 如果香水存在,
rs.next()返回true,打印false,此时游标已经指向第一条记录; - 如果香水不存在,
rs.next()返回false,打印true,游标处于末尾。
之后你在if (!rs....里再次调用rs.next()的话,相当于再次尝试移动游标,这时候的返回值和第一次完全无关,自然会导致条件判断混乱,出现“无论真假都执行”的情况。
修正后的完整代码示例
这里给你写一个规范的实现,解决以上所有问题:
try { // 1. 使用PreparedStatement参数化查询,避免注入和语法错误 String sql = "SELECT Code_Parfum FROM T_Parfum WHERE Nom_Parfum = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); // 替换占位符,第一个参数是占位符索引(从1开始),第二个是用户输入的香水名称 pstmt.setString(1, tbxPerfumeName.getText()); // 2. 执行查询并获取结果集 ResultSet rs = pstmt.executeQuery(); // 3. 只调用一次rs.next(),把结果存到变量里复用 boolean isPerfumeExists = rs.next(); System.out.println(!isPerfumeExists); // 不存在时返回true,存在时返回false // 4. 基于变量进行逻辑判断 if (isPerfumeExists) { // 香水已存在,执行不允许更新的逻辑,比如提示用户 System.out.println("该香水名称已存在,无法执行更新!"); } else { // 香水不存在,执行更新数据的逻辑 System.out.println("香水名称未重复,可以执行更新操作"); // 这里写你的更新代码... } // 记得手动关闭资源,或者用下面的try-with-resources自动关闭 rs.close(); pstmt.close(); } catch (SQLException e) { // 处理数据库异常,比如打印错误信息或提示用户 e.printStackTrace(); }
进阶优化:使用try-with-resources自动关闭资源
Java 7及以上支持try-with-resources语法,能自动关闭实现了AutoCloseable接口的资源(比如ResultSet、PreparedStatement、Connection),避免资源泄漏:
// 假设getConnection()是你获取数据库连接的方法 try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement("SELECT Code_Parfum FROM T_Parfum WHERE Nom_Parfum = ?"); ResultSet rs = pstmt.executeQuery()) { pstmt.setString(1, tbxPerfumeName.getText()); boolean isPerfumeExists = rs.next(); if (isPerfumeExists) { System.out.println("香水名称已存在,拒绝更新"); } else { // 执行更新逻辑 System.out.println("执行数据更新"); } } catch (SQLException e) { e.printStackTrace(); }
这样修改后,你的条件判断逻辑就能正常工作啦~
内容的提问来源于stack exchange,提问作者Aexar
相关产品推荐
相关产品推荐

