结果集在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循环中仅迭代一次的主要内容,如果未能解决你的问题,请参考以下文章