借口: 首先,我想告诉你,我根本不是一个专业的java程序员,并且不知道arrayLists和迭代的所有细节。到目前为止,我已经走了很长的路,但我不知道我的问题,因为我对java中的列表有一点经验。
问题: 我试图把我的sql查询结果(我认为这也是一个数组列表,所以我可能使用了一个不需要的双数组列表。))进入一个ArrayList,之后我就开始了试图将每一行打印到我的控制台,但是我遇到了第一行没有打印的问题。
解决方案: 只要以下两件事情发生,我就会很好:1。将结果放在一个普通的数组中(所以没有ArrayList),这让我更容易,因为我知道如何处理数组。你们可以告诉我为什么第一行没有打印
我的数据库: 我有两个列,第一个是主键(ID),第二个是命令(我想在执行后执行的String(Varchar)。
我的代码:
public List<String> getCommands(){
String sql = "SELECT * FROM query";
try {
PreparedStatement stmt = CONNECTION.prepareStatement(sql);
ResultSet results = stmt.executeQuery();
if (results.next()) {
List<String> row = new ArrayList<String>();
while(results.next()) {
row.add(results.getString(2));
}
return row;
} else {
return null;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
List<String> results = SQL.getCommands();
if(results != null){
getLogger().info("Found at least 1 command");
for (Iterator<String> i = results.iterator(); i.hasNext();) {
String row = i.next();
getLogger().info("command: " + row);
}
}else{
getLogger().info("Can't find commands");
}
我的输出:它会打印数据库中第一行的所有内容。
答案 0 :(得分:1)
看看ResultSet::next,它说:
将光标从当前位置向前移动一行。 ResultSet游标最初位于第一行之前;对方法的第一次调用使得第一行成为当前行;第二个调用使第二行成为当前行,依此类推。
在 while循环之前执行if (results.next())
时,会跳过结果的第一行。
答案 1 :(得分:0)
在将结果添加到列表之前,您需要拨打results.next()
两次。删除if (results.next()) {
语句,一切都应该没问题。
next()
,但是您要调用它两次(在if
和while
语句中),因此光标已经在第二行当你开始阅读行内容时排。
答案 2 :(得分:0)
当您检查if (results.next())
results.next()
实际被调用时,指向行的指针指向结果集的第一个元素。当您到达while(results.next())
时,会再次调用next()
并指向第二个元素,因此您可以删除if(resultset.next())
。