如何使用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
相关产品推荐
相关产品推荐

