2015-07-03 105 views
3

这样的IM使用Statement来执行我的查询和保存返回ResultSet在那么ResultSet对象使用同一ResultSet对象,我遍历从排在我的Java代码中访问MySQL数据库结果并简单地输出每行的数据。结果集迭代只有一个时间,而循环

下面是代码:

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(),它进入循环,并打印出我的表的第二行。

非常感谢您的帮助。

+1

你的代码不能编译:你有没有初始化'st'变量。 –

+0

你确定你的查询返回多行吗? – Ali786

+0

@ ali786我想,这就是他说的问题的调试部分。如果他在调试器中检查了rs.next(),则会找到第二行。 – griFlo

回答

0

我的问题是,在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; 
    } 
} 
+0

正面...那就是为什么我对你写的示例有疑问以前没有逻辑错误或系统错误... – Ali786

0
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); 
} 
+1

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