Java中searchStudentDetails方法无法查询指定姓名数据该如何修改?
问题原因
- 第一次调用
rs.next()判断是否存在数据时,ResultSet的指针已经从初始位置移动到了第一行匹配数据的位置 - 进入else分支后,第二次调用
rs.next()会直接将指针移动到下一行,如果你的查询结果只有1条匹配记录,这时候rs.next()会直接返回false,while循环不会执行,自然没有输出 - 循环内部的
rs.previous()属于多余逻辑,反而会导致指针跳转混乱,如果是多条匹配数据还会出现死循环问题
修复后的代码
public void searchStudentDetails() throws SQLException { DatabaseConnection dbms=new DatabaseConnection("jdbc:mysql://localhost:3306/Studentdb","root","root"); Connection con= dbms.getConnection(); Scanner obj=new Scanner(System.in); System.out.println("Enter your name:"); String inputname=obj.next(); String sql="select * from student where name=? "; PreparedStatement stmt=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); stmt.setString(1, inputname); ResultSet rs=stmt.executeQuery(); // 直接用while遍历,不需要先调用next判断 boolean hasData = false; while(rs.next()) { hasData = true; System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getInt(4)); } if(!hasData) { System.out.println("no such data is found"); } // 按顺序关闭资源 rs.close(); stmt.close(); con.close(); }
额外优化建议
- 可以用try-with-resources语法自动关闭Connection、PreparedStatement、ResultSet资源,不需要手动写close逻辑,避免异常场景下资源泄露
- SQL语句中
*from建议加空格写成* from,符合通用语法规范 - 如果确定name字段是唯一约束,最多返回1条数据,可以直接去掉while循环,读取当前rs的字段值即可
内容的提问来源于stack exchange,提问作者Gojo Saturo
相关产品推荐
相关产品推荐

