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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:57:01