尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Java Swing人事管理系统源码:Swing+JDBC实现桌面端CRUD全链路
简介这是一套基于Java Swing开发的桌面人事管理系统源码面向Java初学者、课程设计学生及需要GUI练手项目的开发者用于解决企业内部员工信息录入、查询、编辑与数据导入导出等基础管理需求。压缩包共36个文件包含16个java源文件与16个class编译文件另有project、prefs、classpath等Eclipse工程配置及一个MySQL驱动jar包整体约771KB结构完整可直接导入IDE运行。系统运用JFrame、JTable、JButton、JTextField、JComboBox、JFileChooser等Swing组件构建界面通过事件监听机制响应用户操作并可能采用MVC模式分离业务逻辑与视图数据持久化可借助JDBC连接数据库或文件存储同时涉及异常处理与错误提示等工程细节。目前已有647人学习下载适合作为理解Swing组件应用、事件处理与桌面项目架构的参考范例。1. 从一次“翻车”的课程设计说起这个 Java Swing 人事管理系统到底能干什么去年帮一个学弟看他的课程设计需求文档写得挺唬人——员工档案、考勤、薪资、部门管理全都有结果跑起来一看主界面按钮点下去没反应数据库里查出来的中文全是问号。他跟我说“Swing 是不是已经淘汰了怎么这么难用”。其实不是 Swing 的问题是这类桌面端管理系统看着简单真要把增删改查、表格渲染、事件分发串起来坑一点都不比 Web 项目少。今天要拆的这个 Java Swing 人事管理系统就是一份能把上面这些模块完整跑通的源码适合正在做课程设计、想找一个能直接改的桌面端 CRUD 模板、或者单纯想搞明白 Swing JDBC 怎么配合的开发者。它不依赖任何前端框架一个 JDK 加一个 MySQL 就能跑起来对新手来说反而是最容易看到“数据从界面到数据库再回来”全链路的项目类型。2. 技术选型与整体架构为什么是 Swing JDBC 这套老组合2.1 分层结构界面、业务、数据三层怎么切这个项目没有用 Spring 那一套走的是最朴素的 MVC 变体。view包放所有 JFrame、JPanel、JDialog负责画界面和收集输入service包放业务逻辑比如“新增员工时先校验工号是否重复”dao包封装 JDBC 操作一个实体对应一个 Dao 类model包就是一堆 POJO字段和数据库表列一一对应。这种切法的好处是你改界面不会碰到 SQL改 SQL 也不会影响按钮布局。常见做法是在dao和service之间再加一层接口但这个项目为了控制代码量直接用了实现类对课程设计来说够用。目录结构大致长这样src/ ├── main/ │ ├── java/ │ │ ├── com/hrms/ │ │ │ ├── view/ # 所有窗体类 │ │ │ ├── service/ # 业务逻辑 │ │ │ ├── dao/ # 数据库访问 │ │ │ ├── model/ # 实体类 │ │ │ └── util/ # 数据库连接、日期工具 │ │ └── resources/ │ │ └── db.properties └── test/2.2 数据库连接一个容易被忽略的配置点项目把数据库配置抽到了db.properties里而不是硬编码在 Java 文件里。这一点很关键因为很多同学交完作业换台电脑跑数据库密码不一样就直接连不上。配置文件内容大概是jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/hrms?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456注意characterEncodingutf8和serverTimezone这两个参数少了任何一个要么中文乱码要么启动就报时区错误。util包里有一个DBUtil类负责读取这个文件并返回Connection所有 Dao 都通过它拿连接。2.3 界面组织主窗体 内部面板的切换方式主界面是一个JFrame左边放JTree或者一列JButton当导航右边是一个JPanel容器。点击不同菜单项时不是弹新窗口而是把对应的业务面板add到这个容器里再revalidate。这样做的好处是只有一个窗口用户体验更接近真实的管理系统。核心切换逻辑在MainFrame里// 右侧内容面板所有业务面板都往这里塞 private JPanel contentPanel new JPanel(new BorderLayout()); // 菜单点击事件里调用 private void switchPanel(JPanel panel) { contentPanel.removeAll(); // 清掉旧面板 contentPanel.add(panel, BorderLayout.CENTER); contentPanel.revalidate(); // 重新布局 contentPanel.repaint(); // 重绘防止残影 }revalidate和repaint这两句是血泪经验只add不调用它们新面板经常显示不出来或者叠在一起。参数上没什么可调的记住成对出现就行。3. 核心模块拆解员工管理从界面到数据库的完整链路3.1 实体类与表格模型数据怎么绑到 JTable 上员工实体Employee有 id、工号、姓名、性别、部门、职位、入职日期、薪资这些字段。Swing 里显示列表用JTable但JTable不直接吃ListEmployee需要包一层AbstractTableModel。项目里自定义了一个EmployeeTableModelpublic class EmployeeTableModel extends AbstractTableModel { private final String[] columns {ID, 工号, 姓名, 性别, 部门, 职位, 入职日期, 薪资}; private ListEmployee data new ArrayList(); public void setData(ListEmployee data) { this.data data; fireTableDataChanged(); // 通知表格刷新 } Override public int getRowCount() { return data.size(); } Override public int getColumnCount() { return columns.length; } Override public String getColumnName(int col) { return columns[col]; } Override public Object getValueAt(int row, int col) { Employee e data.get(row); switch (col) { case 0: return e.getId(); case 1: return e.getEmpNo(); case 2: return e.getName(); // ... 其余字段 default: return null; } } }这里fireTableDataChanged()是刷新表格的关键查完数据调一次setData界面自动更新。如果只改data不调这个方法表格还是旧数据很多人第一次写都会卡在这里。3.2 Dao 层PreparedStatement 与结果集映射以查询所有员工为例Dao 里的写法public ListEmployee findAll() { ListEmployee list new ArrayList(); String sql SELECT * FROM employee ORDER BY id DESC; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { Employee e new Employee(); e.setId(rs.getInt(id)); e.setEmpNo(rs.getString(emp_no)); e.setName(rs.getString(name)); e.setGender(rs.getString(gender)); e.setDeptId(rs.getInt(dept_id)); e.setHireDate(rs.getDate(hire_date)); e.setSalary(rs.getBigDecimal(salary)); list.add(e); } } catch (SQLException ex) { ex.printStackTrace(); } return list; }用 try-with-resources 自动关连接避免忘记close导致连接池耗尽。PreparedStatement除了防注入对日期和金额类型的处理也比拼字符串省心。注意getDate返回的是java.sql.Date存到实体里如果字段是java.util.Date需要转一下项目里在 setter 里做了兼容。3.3 新增与修改表单校验和事务边界新增员工时界面上的“保存”按钮触发service.addEmployee(emp)。Service 里先查工号是否已存在再调 Dao 插入。这里有一个容易翻车的点如果插入员工后还要更新部门人数这两步必须放在同一个事务里。项目里用了一个简单的TransactionTemplate思路public boolean addEmployee(Employee emp) { Connection conn null; try { conn DBUtil.getConnection(); conn.setAutoCommit(false); // 开启事务 if (employeeDao.existsByEmpNo(conn, emp.getEmpNo())) { return false; // 工号重复 } employeeDao.insert(conn, emp); deptDao.incrementCount(conn, emp.getDeptId()); conn.commit(); // 两步都成功才提交 return true; } catch (SQLException e) { if (conn ! null) conn.rollback(); e.printStackTrace(); return false; } finally { DBUtil.close(conn); } }参数说明conn在 Dao 方法里作为参数传入保证多个操作共用同一个连接否则事务不生效。setAutoCommit(false)之后必须显式commit或rollback忘了任何一个都会锁表。4. 避坑与常见问题跑不起来时先查这几条4.1 中文乱码数据库、连接、界面三处都要对现象是表格里姓名显示成问号。原因通常有三个数据库建表时没指定utf8mb4JDBC URL 里没加characterEncodingutf8或者 Swing 组件用了默认字体不支持中文。解决顺序是先确认SHOW CREATE TABLE employee里字符集正确再检查db.properties的 URL最后在main方法开头设置UIManager的字体为“微软雅黑”或“宋体”。4.2 空指针表格选中行后直接取值现象是点击“编辑”按钮报NullPointerException。原因是table.getSelectedRow()在没选中任何行时返回 -1直接拿去data.get(-1)就崩了。解决是在事件处理开头加判断int row table.getSelectedRow(); if (row -1) { JOptionPane.showMessageDialog(this, 请先选择一行); return; }4.3 界面卡死在事件线程里做耗时查询现象是点击“查询”后窗口无响应。原因是 Swing 的事件分发线程EDT里执行了数据库查询查询期间界面不刷新。解决是把查询放到SwingWorker的doInBackground里查完在done里更新表格。项目里数据量小可能感觉不到但一旦联表查询多了就会明显卡顿。4.4 日期格式JTable 里显示成英文长格式现象是入职日期列显示Mon Jan 01 00:00:00 CST 2024。原因是getValueAt直接返回了Date对象JTable默认用toString。解决是返回格式化后的字符串或者在EmployeeTableModel里重写getColumnClass返回String.class再在getValueAt里用SimpleDateFormat转一下。4.5 连接泄漏Dao 里忘了关 ResultSet现象是程序跑一段时间后报“Too many connections”。原因是早期代码里ResultSet没有随Connection一起关闭。解决是统一改成 try-with-resources把Connection、PreparedStatement、ResultSet都写在 try 的括号里让 JVM 自动关。5. 二次开发与改造从能跑到好用我一般会动哪几刀5.1 把硬编码的 SQL 换成配置化查询项目里查询条件基本是写死的比如“按姓名模糊查”就是WHERE name LIKE ?。如果你想加一个“按部门 入职年份”组合筛选最省事的改法是在 Dao 里拼一个StringBuilder根据传入参数动态追加AND条件。但要注意拼接的是条件片段值仍然用?占位。我一般会写一个EmployeeQuery对象把姓名、部门、年份都塞进去Dao 里统一处理这样界面层不用关心 SQL 长什么样。5.2 给表格加一个右键菜单和导出 ExcelJTable默认没有右键菜单加一个JPopupMenu绑定MouseListener就能实现“导出当前选中行”。导出用Apache POI写XSSFWorkbook核心代码不超过二十行。这一步做完课程设计的“创新点”基本就有了。注意 POI 的依赖要加到pom.xml或者lib目录否则运行时报ClassNotFoundException。5.3 用 TableRowSorter 做本地筛选如果不想每次都查数据库可以直接用JTable自带的排序和筛选TableRowSorterEmployeeTableModel sorter new TableRowSorter(tableModel); table.setRowSorter(sorter); // 按姓名筛选 sorter.setRowFilter(RowFilter.regexFilter(张, 2)); // 2 是姓名列索引这样输入框里打字就能实时过滤体验比点按钮查询好很多。参数2是列索引从 0 开始数改列的时候记得同步改。5.4 改造时的一个习惯我每次改完 Dao 层都会先写一个main方法单独跑一遍增删改查确认数据库层面没问题再去调界面。因为 Swing 的异常经常被事件线程吞掉界面没反应但控制台也不报错直接调界面排查效率很低。从那以后我每次动数据库相关代码都强制先跑一遍 Dao 的单元测试再启动主窗体。希望这个习惯也能帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

E430刷BIOS 2.5:版本确认、U盘离线刷写与避坑

E430刷BIOS 2.5:版本确认、U盘离线刷写与避坑

简介:面向联想ThinkPad E430笔记本用户的BIOS更新包,版本2.52,主要用于修复已知硬件兼容性问题、提升系统稳定性,并带来性能优化与安全补丁,适合日常办公、二手设备维护及老机型续用场景。压缩包共2个文件,…

📅 2026/10/23 20:14:11
Java轻量OA系统:基于Activiti的可配置审批流实战

Java轻量OA系统:基于Activiti的可配置审批流实战

简介:这是一套基于SSM框架(SpringSpringMVCMyBatis)开发的Java办公自动化系统(OA),面向Java初学者与中级开发者,适用于课程设计、毕业项目及中小企业轻量级OA定制需求。系统覆盖用户管理、工作流…

📅 2026/10/23 20:14:11
MATLAB多目标跟踪深度解析:从黑盒demo到可调试工业级实现

MATLAB多目标跟踪深度解析:从黑盒demo到可调试工业级实现

简介:本资源是一份面向计算机视觉初学者与MATLAB实践者的多目标跟踪入门级教学包,聚焦视频监控、智能交通等典型场景下的目标检测、状态估计与轨迹关联核心问题。压缩包共3个文件(1个MATLAB主程序run.m、1段实测视频atrium.AVI、1份参考网站说…

📅 2026/10/23 20:14:11
MORE NEWS

更多资讯

📰

ExtJS下拉树插件ComboTree实战:表单树形选择与懒加载避坑指南

简介:这是一份面向ExtJS前端开发者的自定义组件源码,核心是ComboTree下拉树插件,用于解决下拉框中展示层级数据的选择需求,如组织结构、地区分类等场景。资源包共1个文件,为js脚本,压缩包约2KB,…

📰

MATLAB轻量Wasserstein距离计算模块:1D解析解与2D Sinkhorn工程实现

简介:这是一份面向机器学习、统计建模及优化方向研究者与MATLAB初学者的实用工具代码包,聚焦于一维概率分布间Wasserstein距离的高效计算,特别适用于分布对齐、生成模型评估、数据分布比较等场景。资源共3个文件:核心算法脚本ws_d…

📰

JavaEE核心架构图:MyBatis-Spring-SpringMVC-AOP技术栈贯通解析

简介:本资源是面向高校计算机专业学生与JavaEE初学者的期末复习题库,聚焦MyBatis框架核心知识点,系统覆盖ORM原理、SQL映射配置、事务管理、模糊查询安全、动态SQL及工作流程等高频考点,助力高效备考与概念巩固。压缩包为单个41KB…

📰

线性代数工程落地指南:从矩阵变换到SVD诊断

简介:本资源是经典线性代数教材《Linear Algebra and Its Applications》第5版英文原版PDF,由David C. Lay等三位资深数学教育家合著,广泛应用于人工智能、机器学习、计算机图形学等领域的数学基础教学与自学。全书系统覆盖向量空间、线性变换…

📰

信息系统项目管理师计算题五大核心逻辑链实战解析

简介:本资源是面向信息系统项目管理师(高级)备考人员的计算题专项精讲资料,系统覆盖关键路径法、挣值管理(EVM)、三点估算、折旧计算及决策树分析等高频考点,直击考试中易错、易混的定量分析难点…

📰

cachebench实战:Linux缓存层级性能测试、避坑与回归基线

简介:LLCbench 是一套面向 Linux 平台的底层表征基准测试工具,集成了 MPBench、CacheBench 与 BLASBench,此处聚焦其中的 CacheBench,用于评估处理器缓存层次与内存访问性能。适合系统软件、体系结构方向的学习者和开发者开展性能…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬