jdbc项目简易工号管理系统怎么做?如何用Java实现员工工号的增删改查功能?
在企业信息化管理日益普及的今天,一个简单而高效的工号管理系统对于中小型企业的日常运营至关重要。它不仅能帮助HR快速录入和管理员工信息,还能为后续的考勤、薪资、权限分配等模块提供基础数据支持。本文将详细介绍如何基于JDBC(Java Database Connectivity)技术构建一个简易但功能完整的工号管理系统,涵盖数据库设计、Java代码实现、界面交互以及常见问题解决方案。
一、项目目标与功能概述
本系统旨在通过Java语言结合JDBC技术连接MySQL数据库,实现对员工工号的基本操作:添加新员工、修改已有员工信息、删除员工记录、查询所有员工或按工号查找特定员工。整个系统采用命令行界面(CLI),便于初学者理解核心逻辑,同时具备良好的可扩展性,未来可轻松升级为图形化界面(GUI)版本。
二、环境准备与依赖配置
开发前需确保以下环境已安装:
- Java JDK 8 或以上版本(推荐JDK 11+)
- MySQL数据库(建议5.7或8.0)
- IDE工具(如IntelliJ IDEA、Eclipse)
- MySQL JDBC驱动包(mysql-connector-java-x.x.x.jar)
若使用Maven项目结构,可在pom.xml中添加如下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
三、数据库设计
创建名为employee_db的数据库,并在其下建立employees表:
CREATE DATABASE IF NOT EXISTS employee_db CHARACTER SET utf8mb4;
USE employee_db;
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_id VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(50) NOT NULL,
department VARCHAR(50),
phone VARCHAR(20),
hire_date DATE
);
该表包含6个字段,其中employee_id作为主键且唯一,保证每个工号不重复;其余字段用于存储员工基本信息。
四、Java项目结构与核心类设计
项目采用分层架构设计,主要包含以下类:
- DBUtil.java:负责数据库连接池初始化及获取Connection对象
- Employee.java:实体类,对应数据库中的employees表
- EmployeeDAO.java:数据访问对象(DAO),封装CRUD操作方法
- EmployeeManager.java:业务逻辑层,协调DAO与用户输入
- Main.java:主入口类,提供菜单驱动的交互界面
1. DBUtil.java — 数据库连接工具类
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/employee_db";
private static final String USER = "root";
private static final String PASSWORD = "your_password";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
此工具类简化了每次获取连接的过程,避免硬编码,提高代码复用性和安全性。
2. Employee.java — 实体类
public class Employee {
private int id;
private String employeeId;
private String name;
private String department;
private String phone;
private Date hireDate;
// 构造函数、getter/setter方法...
}
该类与数据库表一一映射,是DAO层与Service层之间传递数据的核心载体。
3. EmployeeDAO.java — 数据访问对象
public class EmployeeDAO {
public void addEmployee(Employee emp) throws SQLException {
String sql = "INSERT INTO employees (employee_id, name, department, phone, hire_date) VALUES (?, ?, ?, ?, ?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, emp.getEmployeeId());
stmt.setString(2, emp.getName());
stmt.setString(3, emp.getDepartment());
stmt.setString(4, emp.getPhone());
stmt.setDate(5, new java.sql.Date(emp.getHireDate().getTime()));
stmt.executeUpdate();
}
}
public List getAllEmployees() throws SQLException {
List list = new ArrayList<>();
String sql = "SELECT * FROM employees";
try (Connection conn = DBUtil.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
Employee emp = new Employee();
emp.setId(rs.getInt("id"));
emp.setEmployeeId(rs.getString("employee_id"));
emp.setName(rs.getString("name"));
emp.setDepartment(rs.getString("department"));
emp.setPhone(rs.getString("phone"));
emp.setHireDate(rs.getDate("hire_date"));
list.add(emp);
}
}
return list;
}
public Employee findById(String id) throws SQLException {
String sql = "SELECT * FROM employees WHERE employee_id = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, id);
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
Employee emp = new Employee();
emp.setId(rs.getInt("id"));
emp.setEmployeeId(rs.getString("employee_id"));
emp.setName(rs.getString("name"));
emp.setDepartment(rs.getString("department"));
emp.setPhone(rs.getString("phone"));
emp.setHireDate(rs.getDate("hire_date"));
return emp;
}
}
}
return null;
}
public void updateEmployee(Employee emp) throws SQLException {
String sql = "UPDATE employees SET name=?, department=?, phone=?, hire_date=? WHERE employee_id=?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, emp.getName());
stmt.setString(2, emp.getDepartment());
stmt.setString(3, emp.getPhone());
stmt.setDate(4, new java.sql.Date(emp.getHireDate().getTime()));
stmt.setString(5, emp.getEmployeeId());
stmt.executeUpdate();
}
}
public void deleteEmployee(String id) throws SQLException {
String sql = "DELETE FROM employees WHERE employee_id = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, id);
stmt.executeUpdate();
}
}
}
这个DAO类实现了完整的CRUD功能,每种操作都使用PreparedStatement防止SQL注入,确保安全性。
4. EmployeeManager.java — 业务逻辑处理
public class EmployeeManager {
private EmployeeDAO dao = new EmployeeDAO();
public void addEmployee(Employee emp) {
try {
dao.addEmployee(emp);
System.out.println("✅ 员工添加成功!");
} catch (SQLException e) {
System.err.println("❌ 添加失败:" + e.getMessage());
}
}
public void showAllEmployees() {
try {
List list = dao.getAllEmployees();
if (list.isEmpty()) {
System.out.println("📋 当前无员工数据。");
return;
}
System.out.println("--- 所有员工列表 ---");
for (Employee emp : list) {
System.out.printf("ID: %d | 工号: %s | 姓名: %s | 部门: %s | 电话: %s | 入职日期: %s%n",
emp.getId(), emp.getEmployeeId(), emp.getName(),
emp.getDepartment(), emp.getPhone(), emp.getHireDate());
}
} catch (SQLException e) {
System.err.println("❌ 查询失败:" + e.getMessage());
}
}
public void findEmployeeById(String id) {
try {
Employee emp = dao.findById(id);
if (emp != null) {
System.out.printf("🔍 查找到员工:%s(工号:%s,部门:%s,电话:%s,入职日期:%s)%n",
emp.getName(), emp.getEmployeeId(), emp.getDepartment(),
emp.getPhone(), emp.getHireDate());
} else {
System.out.println("❌ 未找到指定工号的员工。");
}
} catch (SQLException e) {
System.err.println("❌ 查询失败:" + e.getMessage());
}
}
public void updateEmployee(Employee emp) {
try {
dao.updateEmployee(emp);
System.out.println("✅ 员工信息更新成功!");
} catch (SQLException e) {
System.err.println("❌ 更新失败:" + e.getMessage());
}
}
public void deleteEmployee(String id) {
try {
dao.deleteEmployee(id);
System.out.println("✅ 员工删除成功!");
} catch (SQLException e) {
System.err.println("❌ 删除失败:" + e.getMessage());
}
}
}
该类封装了所有业务逻辑,调用DAO完成具体操作,并进行错误处理和友好提示。
5. Main.java — 主程序入口
public class Main {
private static Scanner scanner = new Scanner(System.in);
private static EmployeeManager manager = new EmployeeManager();
public static void main(String[] args) {
while (true) {
System.out.println("\n===== 工号管理系统 =====");
System.out.println("1. 添加员工");
System.out.println("2. 查看全部员工");
System.out.println("3. 根据工号查询员工");
System.out.println("4. 修改员工信息");
System.out.println("5. 删除员工");
System.out.println("0. 退出系统");
System.out.print("请选择操作:");
int choice = scanner.nextInt();
scanner.nextLine(); // 清空缓冲区
switch (choice) {
case 1:
addEmployee();
break;
case 2:
manager.showAllEmployees();
break;
case 3:
System.out.print("请输入工号:");
String id = scanner.nextLine();
manager.findEmployeeById(id);
break;
case 4:
updateEmployee();
break;
case 5:
System.out.print("请输入要删除的工号:");
String delId = scanner.nextLine();
manager.deleteEmployee(delId);
break;
case 0:
System.out.println("👋 感谢使用,再见!");
return;
default:
System.out.println("❌ 输入无效,请重新选择。");
}
}
}
private static void addEmployee() {
System.out.print("请输入工号:");
String empId = scanner.nextLine();
System.out.print("请输入姓名:");
String name = scanner.nextLine();
System.out.print("请输入部门:");
String dept = scanner.nextLine();
System.out.print("请输入电话:");
String phone = scanner.nextLine();
System.out.print("请输入入职日期(YYYY-MM-DD):");
String dateStr = scanner.nextLine();
try {
Date hireDate = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
Employee emp = new Employee();
emp.setEmployeeId(empId);
emp.setName(name);
emp.setDepartment(dept);
emp.setPhone(phone);
emp.setHireDate(hireDate);
manager.addEmployee(emp);
} catch (ParseException e) {
System.err.println("❌ 日期格式错误,请使用 YYYY-MM-DD 格式。");
}
}
private static void updateEmployee() {
System.out.print("请输入要修改的工号:");
String id = scanner.nextLine();
Employee emp = manager.findEmployeeById(id);
if (emp == null) {
System.out.println("❌ 未找到该工号,请确认后再试。");
return;
}
System.out.print("请输入新姓名:");
String name = scanner.nextLine();
System.out.print("请输入新部门:");
String dept = scanner.nextLine();
System.out.print("请输入新电话:");
String phone = scanner.nextLine();
System.out.print("请输入新入职日期(YYYY-MM-DD):");
String dateStr = scanner.nextLine();
try {
Date hireDate = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
emp.setName(name);
emp.setDepartment(dept);
emp.setPhone(phone);
emp.setHireDate(hireDate);
manager.updateEmployee(emp);
} catch (ParseException e) {
System.err.println("❌ 日期格式错误,请使用 YYYY-MM-DD 格式。");
}
}
}
主程序通过循环菜单引导用户操作,配合Scanner接收输入,形成完整的交互流程。
五、运行效果演示
启动程序后,用户将看到清晰的菜单选项。例如:
===== 工号管理系统 =====
1. 添加员工
2. 查看全部员工
3. 根据工号查询员工
4. 修改员工信息
5. 删除员工
0. 退出系统
请选择操作:1
请输入工号:E001
请输入姓名:张三
请输入部门:IT部
请输入电话:13800138000
请输入入职日期(YYYY-MM-DD):2024-01-15
✅ 员工添加成功!
后续可通过编号2查看所有员工,编号3根据工号精准查找,编号4和5分别执行更新和删除操作。
六、常见问题与优化建议
- SQL注入防护:本项目已使用PreparedStatement替代Statement,有效防止SQL注入攻击。
- 异常处理机制:每个数据库操作均包裹在try-catch中,避免程序崩溃,提升健壮性。
- 输入验证增强:可进一步加入正则表达式校验手机号、工号格式等,提升用户体验。
- 日志记录:引入SLF4J或Log4j,记录关键操作日志,方便后期审计和调试。
- 多线程安全:若将来需要并发访问,建议对共享资源加锁或使用ThreadLocal管理Connection。
七、总结与展望
本篇文章详细介绍了如何利用JDBC技术构建一个简易工号管理系统,从数据库设计到Java代码实现,再到交互界面搭建,完整呈现了一个小型企业级应用的开发过程。虽然目前仅为命令行版本,但它具备良好的模块化设计,易于扩展为Web端(如Spring Boot + Thymeleaf)、移动端(Android/iOS)或微服务架构。
对于初学者而言,这是一个极佳的学习案例,能够深入理解JDBC的工作原理、DAO模式的应用场景以及MVC思想的实际落地。对于开发者来说,这套框架可以作为更复杂系统的起点,比如集成权限控制、角色管理、API接口开放等功能,逐步演变为真正的HR管理系统。
总之,掌握这类基础项目的开发能力,是你迈向Java后端开发的第一步。坚持动手实践,你将越来越自信地应对真实世界中的软件工程挑战。

