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

如何使用Java结合JDBC从数据库获取员工层级数据

用Java+JDBC实现员工层级化数据展示

1. 定义员工实体类

要存储员工的ID、姓名、上级ID,同时预留存储下属的列表,用来搭建层级结构:

import java.util.ArrayList;
import java.util.List;

public class Employee {
    private int empId;
    private String empName;
    private int managerId;
    private List<Employee> subordinates;

    public Employee(int empId, String empName, int managerId) {
        this.empId = empId;
        this.empName = empName;
        this.managerId = managerId;
        this.subordinates = new ArrayList<>();
    }

    // 自行补充getter、setter方法
    public void addSubordinate(Employee emp) {
        this.subordinates.add(emp);
    }
}

2. 用JDBC获取所有员工数据

编写工具类从数据库查询全量员工数据,转换为Employee对象列表:

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class EmployeeLoader {
    // 替换为你实际的数据库配置
    private static final String DB_URL = "jdbc:mysql://localhost:3306/你的数据库名";
    private static final String DB_USER = "你的数据库用户名";
    private static final String DB_PASSWORD = "你的数据库密码";

    public static List<Employee> getAllEmployees() {
        List<Employee> employees = new ArrayList<>();
        String sql = "SELECT emp_id, emp_name, manager_id FROM employees";

        // try-with-resources自动关闭资源,避免手动管理引发的问题
        try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
             PreparedStatement stmt = conn.prepareStatement(sql);
             ResultSet rs = stmt.executeQuery()) {

            while (rs.next()) {
                int empId = rs.getInt("emp_id");
                String empName = rs.getString("emp_name");
                int managerId = rs.getInt("manager_id");
                // 处理上级ID为NULL的情况,用-1标记无上级的顶级员工
                if (rs.wasNull()) {
                    managerId = -1;
                }
                employees.add(new Employee(empId, empName, managerId));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return employees;
    }
}

3. 将平级数据转换为层级结构

利用HashMap快速关联员工ID与对象,把每个员工挂载到对应的上级下属列表中:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class HierarchyBuilder {
    public static List<Employee> buildEmployeeHierarchy(List<Employee> employees) {
        Map<Integer, Employee> empMap = new HashMap<>();
        List<Employee> topLevelEmps = new ArrayList<>();

        // 先把所有员工存入Map,方便后续快速查找
        for (Employee emp : employees) {
            empMap.put(emp.getEmpId(), emp);
        }

        // 遍历员工,将非顶级员工挂载到对应上级的下属列表中
        for (Employee emp : employees) {
            int managerId = emp.getManagerId();
            if (managerId == -1) {
                topLevelEmps.add(emp);
            } else {
                Employee manager = empMap.get(managerId);
                if (manager != null) {
                    manager.addSubordinate(emp);
                }
            }
        }
        return topLevelEmps;
    }
}

4. 打印层级化结果

通过递归方法,按层级缩进打印员工结构,直观展示上下级关系:

public class HierarchyPrinter {
    public static void printHierarchy(List<Employee> topEmployees) {
        for (Employee emp : topEmployees) {
            printEmp(emp, 0);
        }
    }

    private static void printEmp(Employee emp, int level) {
        // 用--生成层级缩进,层级越深缩进越多
        String indent = "--".repeat(level);
        System.out.println(indent + emp.getEmpName() + " (ID: " + emp.getEmpId() + ")");

        // 递归打印当前员工的下属
        for (Employee subordinate : emp.getSubordinates()) {
            printEmp(subordinate, level + 1);
        }
    }
}

5. 整合测试

在主方法中串联所有流程,验证层级化效果:

public class Main {
    public static void main(String[] args) {
        List<Employee> allEmps = EmployeeLoader.getAllEmployees();
        List<Employee> hierarchy = HierarchyBuilder.buildEmployeeHierarchy(allEmps);
        HierarchyPrinter.printHierarchy(hierarchy);
    }
}

注意事项

  • 务必替换数据库连接参数为你自己的实际配置,否则无法连接数据库。
  • 如果你的员工表字段名与示例中的emp_id、emp_name、manager_id不一致,需要同步修改SQL查询语句和ResultSet中的字段名。
  • 若数据库中顶级员工的manager_id用0而非NULL标记,将判断条件改为managerId == 0即可。

内容的提问来源于stack exchange,提问作者Sachin Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:25:21