源本科技 | 码上会

Java 员工管理系统

2026/01/22
105
0

系统目标

构建一个基于控制台的员工信息管理工具,支持基本的 CRUD(创建、读取、更新、删除)操作,重点体现以下核心能力:

  • 掌握 面向对象编程(OOP):封装员工属性与行为

  • 理解 三层架构分层思想:View/Controller(视图或控制器)、Mapper(存储)、Service(逻辑)

  • 实践 接口与实现分离EmployeeService 接口 + EmployeeServiceImpl 实现

  • 学会使用 数组作为底层集合结构 管理对象生命周期

  • 实现 健壮的命令行交互体验,包含输入校验与错误提示


核心功能需求

1. 构建员工表(批量初始化)

  • 触发方式:主菜单选择 “1”

  • 输入要求

    • 用户指定要录入的员工数量(≤ 5)

    • 依次输入每位员工的:姓名、ID、职位、工作经验(年)、年龄

  • 处理逻辑

    • 若数量 > 5,自动截断为 5

    • 调用 bulkSave() 清空原数据并重新填充

    • 不校验 ID 唯一性(由用户保证,教学简化)

  • 输出

    • 成功:“员工表构建完成!”

    • 异常:“数量无效!”


2. 新增员工(单条插入)

  • 触发方式:主菜单选择 “2”

  • 前置检查

    • 系统未满(当前人数 < 5)

    • 员工 ID 在系统中 不存在

  • 输入字段

    • 姓名(String)

    • 员工 ID(long,唯一标识)

    • 职位(String)

    • 工作经验(int,单位:年)

    • 年龄(int)

  • 失败原因

    • 系统已满 → “员工表已满,无法添加新记录!”

    • ID 重复 → “添加失败!可能原因:ID 已存在”

  • 成功反馈:“新员工添加成功!”


3. 删除员工(按 ID 移除)

  • 触发方式:主菜单选择 “3”

  • 输入:员工 ID(long)

  • 处理逻辑

    • 线性查找匹配 ID

    • 找到后,将后续元素前移一位

    • 将原末尾位置显式设为 null(防止内存泄漏)

    • 更新有效计数 count

  • 输出

    • 成功:“员工记录已删除!”

    • 失败:“未找到该员工 ID,删除失败!”


4. 查询员工(按 ID 查看详情)

  • 触发方式:主菜单选择 “4”

  • 输入:员工 ID(long)

  • 显示格式(调用 toString()):

--- 员工信息 ---
姓名: 张三
员工 ID: 1001
职位: 软件工程师
工作经验: 3 年
年龄: 28
  • 失败提示:“未找到该员工记录!”


5. 退出系统

  • 触发方式:主菜单选择 “5”

  • 行为:调用 System.exit(0) 正常终止程序

  • 提示:“感谢使用,再见!”


6. 操作流程

启动 Main → 显示欢迎语
   ↓
进入 EmployeeView.launch()
   ↓
显示主菜单(1~5)
   ↓
用户输入选项 → 视图层解析 → 调用 Service 方法
   ↓
Service 执行业务 → 返回结果(boolean / Employee)
   ↓
视图层输出结果 → 自动递归调用 launch() 返回主菜单
   ↓
选择“5” → System.exit(0)

开发流程

项目结构

EmployeeManagementSystem/
├── src/
│   └── employee/
│       ├── entity/            // 实体类
│       │   └── Employee.java
│       ├── mapper/            // 数据访问层(内存数组)
│       │   └── EmployeeMapper.java
│       ├── service/           // 业务逻辑层(接口 + 实现)
│       │   ├── EmployeeService.java      // 接口
│       │   └── impl/EmployeeServiceImpl.java  // 实现类
│       ├── views/             // 视图层(控制台 UI)
│       │   └── EmployeeView.java
│       └── Main.java          // 程序入口

1. 实体层

package employee.entity;

public class Employee {
  private String name;
  private long employeeId;
  private String designation;
  private int experience; // 单位:年
  private int age;

  public Employee(String name, long employeeId, String designation, int experience, int age) {
    this.name = name;
    this.employeeId = employeeId;
    this.designation = designation;
    this.experience = experience;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public long getEmployeeId() {
    return employeeId;
  }

  public void setEmployeeId(long employeeId) {
    this.employeeId = employeeId;
  }

  public String getDesignation() {
    return designation;
  }

  public void setDesignation(String designation) {
    this.designation = designation;
  }

  public int getExperience() {
    return experience;
  }

  public void setExperience(int experience) {
    this.experience = experience;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return String.format("姓名: %s\n员工 ID: %d\n职位: %s\n工作经验: %d 年\n年龄: %d",
            name, employeeId, designation, experience, age);
  }
}

2. 数据访问层

package employee.mapper;

import employee.entity.Employee;

public class EmployeeMapper {

  private static final int MAX_SIZE = 5;
  private static final Employee[] EMPLOYEES = new Employee[MAX_SIZE];
  private static int count = 0;

  // 检查是否已满
  public static boolean isFull() {
    return count >= MAX_SIZE;
  }

  // 检查 ID 是否已存在
  public static boolean existsById(long id) {
    for (int i = 0; i < count; i++) {
      if (EMPLOYEES[i].getEmployeeId() == id) {
        return true;
      }
    }
    return false;
  }

  // 保存新员工(追加到末尾)
  public static boolean save(Employee emp) {
    if (isFull()) return false;
    EMPLOYEES[count] = emp;
    count++;
    return true;
  }

  // 批量初始化(用于“构建员工表”)
  public static void bulkSave(Employee[] list) {
    count = 0; // 清空原有数据
    for (Employee emp : list) {
      if (emp != null && !isFull()) {
        EMPLOYEES[count++] = emp;
      } else {
        break; // 超出容量则停止
      }
    }
  }

  // 按 ID 查找
  public static Employee findById(long id) {
    for (int i = 0; i < count; i++) {
      if (EMPLOYEES[i].getEmployeeId() == id) {
        return EMPLOYEES[i];
      }
    }
    return null;
  }

  // 按 ID 删除(前移覆盖)
  public static boolean deleteById(long id) {
    for (int i = 0; i < count; i++) {
      if (EMPLOYEES[i].getEmployeeId() == id) {
        // 前移后续元素
        for (int j = i; j < count - 1; j++) {
          EMPLOYEES[j] = EMPLOYEES[j + 1];
        }
        EMPLOYEES[count - 1] = null; // 清空最后一个
        count--;
        return true;
      }
    }
    return false;
  }

  // 获取当前数量(用于调试或限制)
  public static int getCount() {
    return count;
  }

  // 获取最大容量
  public static int getMaxSize() {
    return MAX_SIZE;
  }
}

3. 服务层

package employee.service;

import employee.entity.Employee;

public interface EmployeeService {
  boolean buildTable(Employee[] employees); // 批量初始化

  boolean addEmployee(Employee employee);

  boolean removeEmployee(long employeeId);

  Employee findEmployee(long employeeId);

  int getCurrentCount();

  int getMaxCapacity();
}

4. 服务层(实现类)

package employee.service.impl;

import employee.entity.Employee;
import employee.mapper.EmployeeMapper;
import employee.service.EmployeeService;

public class EmployeeServiceImpl implements EmployeeService {

  @Override
  public boolean buildTable(Employee[] employees) {
    if (employees == null) return false;
    EmployeeMapper.bulkSave(employees);
    return true;
  }

  @Override
  public boolean addEmployee(Employee employee) {
    if (employee == null) return false;
    if (EmployeeMapper.isFull()) return false;
    if (EmployeeMapper.existsById(employee.getEmployeeId())) {
      return false; // ID 重复
    }
    return EmployeeMapper.save(employee);
  }

  @Override
  public boolean removeEmployee(long employeeId) {
    return EmployeeMapper.deleteById(employeeId);
  }

  @Override
  public Employee findEmployee(long employeeId) {
    return EmployeeMapper.findById(employeeId);
  }

  @Override
  public int getCurrentCount() {
    return EmployeeMapper.getCount();
  }

  @Override
  public int getMaxCapacity() {
    return EmployeeMapper.getMaxSize();
  }
}

5. 视图层

package employee.views;

import employee.entity.Employee;
import employee.service.EmployeeService;
import employee.service.impl.EmployeeServiceImpl;

import java.util.Scanner;

public class EmployeeView {
  private static final Scanner scanner = new Scanner(System.in);
  private static final EmployeeService service = new EmployeeServiceImpl();

  public static void launch() {
    System.out.println("\n" + "=".repeat(50));
    System.out.println("         员工管理系统");
    System.out.println("=".repeat(50));
    System.out.println("1. 构建员工表");
    System.out.println("2. 新增员工");
    System.out.println("3. 删除员工");
    System.out.println("4. 查询员工");
    System.out.println("5. 退出系统");
    System.out.print("请选择操作 (1-5): ");

    try {
      int option = Integer.parseInt(scanner.nextLine());
      switch (option) {
        case 1 -> handleBuildTable();
        case 2 -> handleAddEmployee();
        case 3 -> handleDeleteEmployee();
        case 4 -> handleSearchEmployee();
        case 5 -> {
          System.out.println("感谢使用,再见!");
          System.exit(0);
        }
        default -> {
          System.out.println("无效选项,请输入 1-5 之间的数字!");
          launch();
        }
      }
    } catch (NumberFormatException e) {
      System.out.println("请输入有效数字!");
      launch();
    }
  }

  private static void handleBuildTable() {
    int max = service.getMaxCapacity();
    System.out.println("构建员工表(最多 " + max + " 人)");
    System.out.print("请输入要录入的员工数量: ");
    int count = Integer.parseInt(scanner.nextLine());

    if (count <= 0) {
      System.out.println("数量无效!");
      launch();
      return;
    }

    if (count > max) {
      System.out.println("超出最大限制,自动设为 " + max);
      count = max;
    }

    Employee[] list = new Employee[count];
    for (int i = 0; i < count; i++) {
      System.out.println("第 " + (i + 1) + " 位员工信息:");
      System.out.print("姓名: ");
      String name = scanner.nextLine();
      System.out.print("员工 ID: ");
      long id = Long.parseLong(scanner.nextLine());
      System.out.print("职位: ");
      String designation = scanner.nextLine();
      System.out.print("工作经验(年): ");
      int exp = Integer.parseInt(scanner.nextLine());
      System.out.print("年龄: ");
      int age = Integer.parseInt(scanner.nextLine());

      list[i] = new Employee(name, id, designation, exp, age);
    }

    service.buildTable(list);
    System.out.println("员工表构建完成!");
    launch();
  }

  private static void handleAddEmployee() {
    if (service.getCurrentCount() >= service.getMaxCapacity()) {
      System.out.println("员工表已满,无法添加新记录!");
      launch();
      return;
    }

    System.out.println("请输入新员工信息:");
    System.out.print("姓名: ");
    String name = scanner.nextLine();
    System.out.print("员工 ID: ");
    long id = Long.parseLong(scanner.nextLine());
    System.out.print("职位: ");
    String designation = scanner.nextLine();
    System.out.print("工作经验(年): ");
    int exp = Integer.parseInt(scanner.nextLine());
    System.out.print("年龄: ");
    int age = Integer.parseInt(scanner.nextLine());

    Employee emp = new Employee(name, id, designation, exp, age);
    if (service.addEmployee(emp)) {
      System.out.println("新员工添加成功!");
    } else {
      System.out.println("添加失败!可能原因:ID 已存在 或 系统已满。");
    }
    launch();
  }

  private static void handleDeleteEmployee() {
    System.out.print("请输入要删除的员工 ID: ");
    long id = Long.parseLong(scanner.nextLine());
    if (service.removeEmployee(id)) {
      System.out.println("员工记录已删除!");
    } else {
      System.out.println("未找到该员工 ID,删除失败!");
    }
    launch();
  }

  private static void handleSearchEmployee() {
    System.out.print("请输入要查询的员工 ID: ");
    long id = Long.parseLong(scanner.nextLine());
    Employee emp = service.findEmployee(id);
    if (emp != null) {
      System.out.println("\n--- 员工信息 ---");
      System.out.println(emp);
    } else {
      System.out.println("未找到该员工记录!");
    }
    launch();
  }
}

使用 scanner.nextLine() 避免换行符残留问题,提升输入稳定性。


6. 主程序入口

package employee;

import employee.views.EmployeeView;

public class Main {
  public static void main(String[] args) throws Exception {
    System.out.println("欢迎使用员工管理系统!");
    EmployeeView.launch();
  }
}