构建一个基于控制台的员工信息管理工具,支持基本的 CRUD(创建、读取、更新、删除)操作,重点体现以下核心能力:
掌握 面向对象编程(OOP):封装员工属性与行为
理解 三层架构分层思想:View/Controller(视图或控制器)、Mapper(存储)、Service(逻辑)
实践 接口与实现分离:EmployeeService 接口 + EmployeeServiceImpl 实现
学会使用 数组作为底层集合结构 管理对象生命周期
实现 健壮的命令行交互体验,包含输入校验与错误提示
触发方式:主菜单选择 “1”
输入要求:
用户指定要录入的员工数量(≤ 5)
依次输入每位员工的:姓名、ID、职位、工作经验(年)、年龄
处理逻辑:
若数量 > 5,自动截断为 5
调用 bulkSave() 清空原数据并重新填充
不校验 ID 唯一性(由用户保证,教学简化)
输出:
成功:“员工表构建完成!”
异常:“数量无效!”
触发方式:主菜单选择 “2”
前置检查:
系统未满(当前人数 < 5)
员工 ID 在系统中 不存在
输入字段:
姓名(String)
员工 ID(long,唯一标识)
职位(String)
工作经验(int,单位:年)
年龄(int)
失败原因:
系统已满 → “员工表已满,无法添加新记录!”
ID 重复 → “添加失败!可能原因:ID 已存在”
成功反馈:“新员工添加成功!”
触发方式:主菜单选择 “3”
输入:员工 ID(long)
处理逻辑:
线性查找匹配 ID
找到后,将后续元素前移一位
将原末尾位置显式设为 null(防止内存泄漏)
更新有效计数 count
输出:
成功:“员工记录已删除!”
失败:“未找到该员工 ID,删除失败!”
触发方式:主菜单选择 “4”
输入:员工 ID(long)
显示格式(调用 toString()):
--- 员工信息 ---
姓名: 张三
员工 ID: 1001
职位: 软件工程师
工作经验: 3 年
年龄: 28失败提示:“未找到该员工记录!”
触发方式:主菜单选择 “5”
行为:调用 System.exit(0) 正常终止程序
提示:“感谢使用,再见!”
启动 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 // 程序入口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);
}
}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;
}
}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();
}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();
}
}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()避免换行符残留问题,提升输入稳定性。
package employee;
import employee.views.EmployeeView;
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("欢迎使用员工管理系统!");
EmployeeView.launch();
}
}