如何将IntegrationWithDB类的ResultSet全量值传递至其他类方法?
问题分析与解决方案
你遇到的核心问题是:每次循环都在覆盖同一个对象的属性值,导致遍历完数据库结果集后,IntegrationWithDB对象里只保留了最后一条数据的信息。当你在test类里循环输出时,其实一直在读取同一个对象的属性,自然全是最后一条记录。
下面是具体的修正方案,同时帮你修正代码里的几个小bug:
步骤1:创建实体类封装单条记录(更规范的面向对象写法)
首先新建一个Contact类,用来单独存储每条联系人记录的属性,避免覆盖问题:
public class Contact { private int id; private String name; private String parent; private int level; // 构造方法 public Contact(int id, String name, String parent, int level) { this.id = id; this.name = name; this.parent = parent; this.level = level; } // Getter方法(按需添加Setter) public int getId() { return id; } public String getName() { return name; } public String getParent() { return parent; } public int getLevel() { return level; } }
步骤2:修改IntegrationWithDB类,用集合存储所有结果
修改selectFromDB方法,每次循环创建一个新的Contact对象,把所有记录存入集合,最后返回整个集合:
import java.sql.*; import java.util.ArrayList; import java.util.List; public class IntegrationWithDB { private Connection conn; private Statement stmt; private ResultSet rs; private String query; // 新增集合存储所有联系人数据 private List<Contact> contactList = new ArrayList<>(); // 你的getConnection()方法保持不变,这里省略 public List<Contact> selectFromDB() { contactList.clear(); // 每次查询前清空旧数据 try { if (conn == null) { getConnection(); } if (stmt == null) { stmt = conn.createStatement(); } query = "select * from contacts order by node_id"; rs = stmt.executeQuery(query); while (rs.next()) { // 注意:你原来的代码里setLvl用了node_parent,这是笔误!应该是node_level Contact contact = new Contact( rs.getInt("node_id"), rs.getString("node_name"), rs.getString("node_parent"), rs.getInt("node_level") ); contactList.add(contact); // 将当前记录加入集合 } // 查询操作不需要commit/rollback,只有增删改才需要事务控制 } catch (Exception ex) { ex.printStackTrace(); try { if (conn != null) conn.rollback(); } catch (SQLException e) { e.printStackTrace(); } } finally { // 必须关闭数据库资源,避免连接泄漏 try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return contactList; } }
步骤3:修改test类,遍历集合输出所有数据
现在可以直接遍历返回的集合,输出每条记录的信息:
import java.util.List; public class Test { // 类名首字母大写,符合Java规范 public void displayList() { IntegrationWithDB qaz = new IntegrationWithDB(); List<Contact> contacts = qaz.selectFromDB(); // 遍历所有联系人数据 for (Contact contact : contacts) { System.out.println("ID: " + contact.getId()); System.out.println("Name: " + contact.getName()); System.out.println("Parent: " + contact.getParent()); System.out.println("Level: " + contact.getLevel()); System.out.println("---"); // 分隔每条记录,更清晰 } } // 测试入口 public static void main(String[] args) { new Test().displayList(); } }
额外需要注意的问题
- 变量名规范:你原来的
Nam、Parnt、Lvl不符合Java驼峰命名法,建议改成name、parent、level - 字段笔误:原来代码里
setLvl(rs.getInt("node_parent"))是错误的,应该对应node_level字段,否则level值会和parent的ID重复 - 资源关闭:一定要在
finally块里关闭ResultSet、Statement、Connection,避免数据库连接泄漏
内容的提问来源于stack exchange,提问作者shaun Tait
相关产品推荐
相关产品推荐

