如何将数据库表指定行数据存入ArrayList并完整输出所有行?
解决数据库查询结果仅输出最后一行的问题
嘿,我一眼就发现问题所在了!你的代码现在只能输出最后一行数据,根源在于两个关键的小疏漏:
- 每次循环都覆盖了
inner列表:你在while(rs.next())循环里每次都重新创建new ArrayList<>()赋值给inner,前一行的数据会被完全覆盖,最后只剩下最后一次循环创建的列表。 - 只打印了一次
inner:你把System.out.println(inner)放在了循环外面,自然只能看到最后一次创建的那个列表里的内容。
修复方案
咱们需要一个外层列表来存储每一行的inner列表(也就是一个嵌套的ArrayList<ArrayList<String>>),同时把打印操作放到合适的位置,确保每一行数据都能被输出。
修改后的完整代码
ArrayList<ArrayList<String>> allRows = new ArrayList<>(); // 用来存储所有行数据的外层列表 try{ // 注意:原SQL里的Score是笔误,表结构里的字段是BILL,这里修正了 String sql="select Name, BILL, Contact from members"; pst=conn.prepareStatement(sql); rs=pst.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int columnsNumber = rsmd.getColumnCount(); while (rs.next()) { ArrayList<String> inner = new ArrayList<>(); // 为当前行创建新的列表 for(int i=1; i<=columnsNumber; i++){ inner.add(rs.getString(i)); } allRows.add(inner); // 将当前行的列表存入外层列表,避免数据丢失 System.out.println(inner); // 每处理完一行就打印,直接得到你要的格式 } // 如果你想在循环结束后统一打印所有行,也可以用这段代码替代上面的循环内打印: // for(ArrayList<String> row : allRows) { // System.out.println(row); // } }catch(Exception e){ e.printStackTrace(); // 建议加上异常堆栈打印,方便排查潜在问题 }
关键修改点说明
- 新增了
allRows外层列表:用来保存每一行的inner列表,彻底解决数据被覆盖的问题 - 保留了循环内创建
inner的逻辑:确保每一行数据都存在独立的列表里 - 修正了SQL字段名:原代码里写的
Score和表结构的BILL不匹配,这个小问题会导致查询报错,必须修正 - 把打印移到循环内部:每处理一行就输出一行,完全符合你期望的格式
- 添加了异常打印:原catch块是空的,一旦出现数据库连接、查询异常你根本不知道问题在哪,加上
e.printStackTrace()能帮你快速定位bug
预期输出
修改后运行代码,就能得到你想要的结果:
[james,400,024669] [Mavis,700,025550] [john,650,029510] [bendo,340,023579]
内容的提问来源于stack exchange,提问作者Rodney Nart
相关产品推荐
相关产品推荐

