Java JDBC查询items表itemName字段匹配用户输入异常解决方案
问题原因及解决方案
问题根因
你的代码逻辑存在设计错误,而非rs.next()工作异常:
- 你遍历全表的每一条记录时,逐行立即判断匹配结果,只要当前遍历到的记录和用户输入不匹配,就会直接触发else分支输出错误提示
- 比如目标匹配的是第3条记录,遍历第1、2条时就会连续输出两次错误,哪怕第3条匹配成功,前面已经输出了错误内容,和预期效果完全不符
解决方案
方案1(推荐):调整SQL查询逻辑,直接过滤匹配结果
不需要查询全表后在Java层判断,直接在SQL里加匹配条件,不仅逻辑简单,还能大幅降低不必要的数据传输:
System.out.println("enter name of item you want to order"); String userOrder = br.readLine(); Connection con = ConnectionToDB.connection(); // 注意:实际生产环境不要用字符串拼接SQL,会有SQL注入风险,改用PreparedStatement String sql = "select itemName from items where itemName = ?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, userOrder); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { // 存在匹配项 System.out.println(rs.getString("itemName")); } else { // 整个结果集为空,说明无匹配 System.out.println("you order wrong item that not present"); } // 后续记得关闭ResultSet、Statement、Connection资源
注意:使用
PreparedStatement替代Statement可以避免SQL注入风险,是数据库操作的标准规范。
方案2:不改SQL的前提下调整Java判断逻辑
如果必须查询全表做其他处理,可以加一个标记位记录是否匹配到结果,遍历完所有记录后再判断是否输出错误:
System.out.println("enter name of item you want to order"); String userOrder = br.readLine(); Connection con = ConnectionToDB.connection(); String itemName= "select itemName from items"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(itemName); // 新增匹配标记 boolean hasMatch = false; while(rs.next()) { if (rs.getString("itemName").equals(userOrder)) { System.out.println(rs.getString("itemName")); hasMatch = true; // 如果只需要匹配第一个结果,这里可以加break跳出循环 } } // 遍历完所有记录后再判断是否无匹配 if (!hasMatch) { System.out.println("you order wrong item that not present"); } // 后续记得关闭资源
内容的提问来源于stack exchange,提问作者Ritvik
相关产品推荐
相关产品推荐

