You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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();
    }
}

额外需要注意的问题

  1. 变量名规范:你原来的Nam、Parnt、Lvl不符合Java驼峰命名法,建议改成name、parent、level
  2. 字段笔误:原来代码里setLvl(rs.getInt("node_parent"))是错误的,应该对应node_level字段,否则level值会和parent的ID重复
  3. 资源关闭:一定要在finally块里关闭ResultSet、Statement、Connection,避免数据库连接泄漏

内容的提问来源于stack exchange,提问作者shaun Tait

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:34:08