结果集在while循环中仅迭代一次

Posted

技术标签:

【中文标题】结果集在while循环中仅迭代一次【英文标题】:resultset iterating only one time on while loop 【发布时间】:2015-09-20 21:05:18 【问题描述】:

所以我使用Statement 访问我的java 代码中的mysql 数据库来执行我的查询并将返回的ResultSet 保存在ResultSet 对象中,然后使用相同的ResultSet 对象,我从结果并简单地打印出每一行的数据。

代码如下:

public class DBConnect 
    private Connection conn;
    private Statement st;
    private ResultSet rs;

    public DBConnect()
        try
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/unal_grades", "root", "");
            st = conn.createStatement();
        catch(Exception ex)
            System.out.println("Error: " + ex);
        
    

public ArrayList<Semester> getSemesters()
    try
        ArrayList<Semester> semesters = new ArrayList<Semester>();
        String query = "Select * from semester";
        rs = st.executeQuery(query);
        System.out.println("semesters");
        while(rs.next())
            int id = rs.getInt("id");
            String name = rs.getString("name");
            float average = rs.getFloat("average");
            boolean active = rs.getBoolean("active");

            System.out.println(name+" / "+average+" / "+active);
            Semester semester = new Semester(id, name, average, active);
            semester.setClasses(getClasses(semester));
            semesters.add(semester);
        
        System.out.println();
        return semesters;
    catch(Exception ex)
        System.out.println("Error: " + ex);
    
    return null;

我的问题是,在 while 循环中,rs.next() 语句仅在第一次迭代时返回 true。换句话说,当实际有很多行时,它只会打印我的表在数据库中的第一行。

调试时,如果我在实际运行之前检查rs.next(),当我在第一次迭代中实际运行它时,它会进入循环并打印出我的表格的第二行。

非常感谢您的帮助。

【问题讨论】:

你的代码没有编译:你还没有初始化st变量。 您确定您的查询返回的不止一行吗? @ali786 我想,这就是他对问题的调试部分所说的话。如果他在调试器中检查rs.next(),则找到第二行。 @SantiagoAlvarez 但是你确定你的 while 块没有异常吗? (我不认为那是你的全部代码)。我无法想象为什么你不应该得到所有的行。 @TagirValeev 谢谢我解决了这个问题,但这是帖子上的错误。 【参考方案1】:

我的问题是,在getClasses() 方法中,我还修改了rs 变量,所以在while 循环中,变量不一样,所以它返回false。

解决方案是在每个方法中将ResultSet rs 变量设为局部变量。

像这样:

public class DBConnect 
    private Connection conn;

    public DBConnect()
        try
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/unal_grades", "root", "");
        catch(Exception ex)
             System.out.println("Error: " + ex);
        
    

    public ArrayList<Semester> getSemesters()
        ResultSet rs;
        try
            Statement st = conn.createStatement();
            ArrayList<Semester> semesters = new ArrayList<Semester>();
            String query = "Select * from semester";
            rs = st.executeQuery(query);
            System.out.println("semesters");
            while(rs.next())
                int id = rs.getInt("id");
                String name = rs.getString("name");
                float average = rs.getFloat("average");
                boolean active = rs.getBoolean("active");

                System.out.println(name+" / "+average+" / "+active);
                Semester semester = new Semester(id, name, average, active);
                semester.setClasses(getClasses(semester));
                semesters.add(semester);
            
            System.out.println();
            return semesters;
        catch(Exception ex)
            System.out.println("Error: " + ex);
        
        return null;
    

【讨论】:

肯定...这就是为什么我怀疑您之前编写的示例没有逻辑错误或系统错误...【参考方案2】:
Statement st;
ResultSet rs;
try
  String query = "Select * from semester";
  st = con.createStatement();
  rs = st.executeQuery(query);
  System.out.println("semesters");

  while(rs.next())
    int id = rs.getInt("id");
    String name = rs.getString("name");
    float average = rs.getFloat("average");
   boolean active = rs.getBoolean("active");

    System.out.println(name+" / "+average+" / "+active);


System.out.println();
 catch(Exception ex)
   System.out.println("Error: " + ex);
  

【讨论】:

@SantiagoAlvarez 他添加了st = con.createStatement(); (我认为您在原始代码中有什么。否则您的 Statement 变量将不会被初始化)

以上是关于结果集在while循环中仅迭代一次的主要内容,如果未能解决你的问题,请参考以下文章

while 循环只迭代一次

嵌套的while循环在第一次迭代PHP后停止

我的 do while 循环在一次迭代后停止。我该如何继续下去?

while循环中的文件复制仅执行一次

python第七课——循环结构 while

循环语句while与for的穷举迭代