简介:面向数据库课程设计学习者的一套Java Swing人事管理系统源码包,整合MySQL与JDBC,覆盖从界面设计到数据库操作的典型流程,适合初学Java桌面应用的学生完成课设或练习JDBC编程。压缩包共24个文件,包括11个Java源文件、12张界面运行截图和1个SQL建库脚本,整体仅143KB;Java文件按登录、员工管理、部门管理等模块组织,SQL脚本可快速建表并写入测试数据,截图则直观展示各功能窗口的实际效果。目前已有3878人学习下载,足见其参考价值。需要提醒的是,因数据库版本差异,导入运行后可能遇到一些基础报错,多为驱动或SQL语法兼容问题,可自行调整解决,这也是一次很好的排查实践。这份资源体量轻、结构清晰,既能直接作为课程设计源码提交,也能在此基础上按需扩展,是掌握Swing+MySQL+JDBC整合开发的实用范例。
1. 人事管理系统不是跑通就完事:先弄清这份资源解决什么
用 Java Swing 做界面、MySQL 存数据、JDBC 搭桥,这是数据库课程设计里出现频率最高的一套组合。你下载的这份 mysql+java 人事管理压缩包,包含完整的 src 源码、images 图标目录和 databaseproject.sql 初始化脚本,属于「有界面、能登录、能做增删改查」的标准课设成品。我拆过不少同类项目,这类资源最大的特点不是代码多难,而是「能不能在你这台机器上跑起来」——数据库版本不同、驱动包没放对位置、字符集不一致,任何一个环节都能卡你一晚上。这篇笔记就按「环境搭建 → 数据建模 → JDBC 链路 → 排错」的顺序,把这份资源从头到尾过一遍,顺便把最容易翻车的几个坑提前指出来。
适合谁看?如果你是正在做数据库课设、想参考一套能跑的完整代码,或者刚接触 Swing + JDBC 想找个项目练手,这份资源都够用。但如果你指望下载下来双击就能出界面,那先调整预期——它需要你手动配环境。
2. 环境复现:JDBC 驱动、MySQL 版本与工程导入的细节
2.1 为什么这个组合最容易在环境上翻车
Swing 是老技术,MySQL 的 JDBC 驱动也分了 5.x 和 8.x 两个大版本线,两者对连接 URL 的写法、驱动的类名要求完全不同。这份资源的代码大概率是按「MySQL 5.x + mysql-connector-java 5.1.x」这个组合写的,因为课程设计里最常见的就是这套搭配。
判断方法很简单:打开项目里的数据库连接代码,看 import 的是com.mysql.jdbc.Driver还是com.mysql.cj.jdbc.Driver。前者是 5.x 驱动,后者是 8.x 驱动。如果你本机装的是 MySQL 8.0,却用 5.x 驱动,连接时报错会非常诡异——有时候是 ClassNotFoundException,有时候是 SSL 握手失败。
我建议你直接按资源自带的驱动 jar 来准备环境。压缩包里如果没带 jar,就去 MySQL 官方下载对应版本的 Connector/J。版本匹配是第一优先级,别在这个环节省时间。
2.2 把工程导入 IDE 的完整步骤
资源解压后是 src、images、sql 三个目录和一个 databaseproject.sql 文件。src 里是 Java 源码,images 是界面用到的图标,sql 里是建库建表语句。我用 IDEA 做示范,Eclipse 的操作类似,核心是一样的。
# 目录结构确认 mysql+java人事管理/ ├── src/ # Java 源码,包含 com/xxx/swing、dao、model 等包 ├── images/ # 界面图标,通常是 .png 或 .gif ├── sql/ # 部分资源的 SQL 脚本放这里 └── databaseproject.sql # 建库、建表、初始化数据的完整脚本在 IDEA 里新建一个空项目,把 src 目录标记为 Sources Root,再把 images 目录放到项目根目录下。这个操作很关键——Swing 代码里加载图标通常用的是相对路径,比如new ImageIcon("images/login.png"),如果你的工作目录不对,界面会显示空白图标,但程序不报错。
接下来把 MySQL 驱动 jar 添加到项目依赖。IDEA 的操作是 Project Structure → Libraries → 加号 → Java,选中你下载的 mysql-connector-java 版本。这一步做完后,代码里 importjava.sql.*和com.mysql.jdbc.Driver才不会报红。
提示:如果你用的是 IDEA 2023 以上版本,注意 lib 目录要手动创建,IDEA 不会自动把 jar 文件放进项目里。最常见的错误是 jar 下载了但没加进依赖,编译期不报错,运行期才抛 ClassNotFoundException。
2.3 数据库初始化脚本的执行与验证
databaseproject.sql 是整份资源的地基。先不要急着双击执行,我一般会先用文本编辑器打开看一眼头部,确认它里面建的是什么库名、有哪些表。
# 在 MySQL 命令行里执行脚本 mysql -u root -p < databaseproject.sql如果你装了 Navicat 或 DataGrip,也可以直接打开脚本文件,选中全部内容后执行。执行完验证一下:
-- 查看是否建库成功 SHOW DATABASES; -- 切换到人事管理数据库(具体库名以脚本为准,通常是 personnel 或 hr 开头) USE 库名; -- 列出所有表 SHOW TABLES;验证的重点是表数量。人事管理系统一般至少包含管理员表、员工信息表、部门表这三张。如果你 SHOW TABLES 的结果里只有一张表,说明脚本执行了一半就中断了,常见原因是脚本里有 MySQL 5.7 不兼容的语法,或者脚本编码格式不是 UTF-8。
执行完脚本后别急着关命令行,再用 SELECT 查一下每张表的行数。很多课设脚本会附带几条测试数据,比如预置一个 admin 账号,这些数据是后面验证登录功能好不好用的参照物。
3. 核心数据表与 JDBC 增删改查链路剖析
3.1 表结构的设计意图
打开 databaseproject.sql,你能看到典型的课设级建模思路。以员工表为例,常见字段是员工编号、姓名、性别、出生日期、部门 ID、入职日期、联系电话,主键用自增 ID,部门表和员工表之间用外键关联。
-- 部门表 CREATE TABLE IF NOT EXISTS dept ( dept_id INT PRIMARY KEY AUTO_INCREMENT, dept_name VARCHAR(50) NOT NULL, remark VARCHAR(200) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 员工表 CREATE TABLE IF NOT EXISTS emp ( emp_id INT PRIMARY KEY AUTO_INCREMENT, emp_no VARCHAR(20) NOT NULL UNIQUE COMMENT '工号', emp_name VARCHAR(30) NOT NULL, gender CHAR(2) DEFAULT '男', birthday DATE, dept_id INT, hire_date DATE, phone VARCHAR(20), CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES dept(dept_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;注意 DEFAULT CHARSET 这一句,这是很多课设项目埋雷的地方。资源里写的是 utf8,但如果你本机 MySQL 8.0 的默认字符集是 utf8mb4,而代码里查询用的又是中文,就很容易出现乱码或者「Incorrect string value」报错。我一般会把脚本里的字符集统一改成 utf8mb4,反正向下兼容。
外键约束在这种课设里是加分项,但对于初学的人也可能是负担——如果你往 emp 表插数据时 dept_id 引用了一个不存在的部门 ID,MySQL 会直接拒绝写入。这不是代码 bug,是数据库约束在起作用,答辩时能讲清楚这一点反而是亮点。
3.2 登录模块与 JDBC 连接的完整流程
登录功能是几乎所有 Swing 课设的第一道门。它的逻辑不复杂:界面层取用户名密码,业务层调用 DAO,DAO 里通过 JDBC 执行 SQL 查询。但就是这个看似简单的流程,代码质量高下立判。
// 典型的 JDBC 连接工具类,很多课设里长这样 public class DBUtil { private static final String URL = "jdbc:mysql://localhost:3306/personnel"; private static final String USER = "root"; private static final String PASSWORD = "123456"; static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }这段代码有四个地方需要你根据本机环境改:URL 里的端口默认 3306,如果你改了 MySQL 端口要同步;库名 personnel 要和 databaseproject.sql 里建库的名字一致;用户名密码要改成你自己的;com.mysql.jdbc.Driver如果换成了 MySQL 8.x 驱动,要改成com.mysql.cj.jdbc.Driver。
提示:登录模块里最常见的问题是 SQL 注入。课设代码里经常直接写
SELECT * FROM admin WHERE username='"+name+"' AND password='"+pwd+"',这在答辩演示时没问题,但如果老师追问安全策略,你至少要能说出 PreparedStatement 的区别。
3.3 员工信息的增删改查是怎么走通 JDBC 链路的
员工管理模块是这份资源的核心功能,最值得对照源码逐行看。它的典型结构是一个 JTable 展示数据,点按钮弹出新增/编辑窗口,保存后刷新表格。数据链路是 Swing 事件 → Service/DAO 方法 → JDBC 执行 SQL → ResultSet 回填到 TableModel。
// 查询所有员工的典型 DAO 方法 public List<Emp> findAll() { List<Emp> list = new ArrayList<>(); String sql = "SELECT e.*, d.dept_name FROM emp e LEFT JOIN dept d ON e.dept_id = d.dept_id"; try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { while (rs.next()) { Emp e = new Emp(); e.setEmpId(rs.getInt("emp_id")); e.setEmpNo(rs.getString("emp_no")); e.setEmpName(rs.getString("emp_name")); e.setGender(rs.getString("gender")); e.setDeptName(rs.getString("dept_name")); list.add(e); } } catch (SQLException ex) { ex.printStackTrace(); } return list; }注意这段代码里的try-with-resources写法,这是 JDK 7 以后的推荐做法,连接、语句、结果集都会自动关闭。如果你看到的课设代码里用的是老式try { } finally { conn.close(); },功能上没问题,但你可以按上面这种风格重写,答辩时能加分。
LEFT JOIN 这张表的用处是把外键 ID 翻译成部门名称显示在 JTable 里,这是课设项目里非常标准的手法。如果你发现界面上「部门」一列显示的是数字而不是名字,检查的就是这条 SQL。
新增、修改、删除三个操作本质上是同一套模板:写 SQL → 创建 PreparedStatement → 设置参数 → executeUpdate → 按返回值判断影响行数。区别只在 SQL 语句本身。我建议你把这三个方法放一起对比看,比单独看一个更容易理解「参数占位符 ?」的用法。
4. JDBC 连接 MySQL 避坑指南:四类高频报错的处理记录
4.1 ClassNotFoundException:驱动 jar 没进 lib
现象:运行程序时控制台直接抛java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,但编译期没有任何错误。
原因:代码里Class.forName("com.mysql.jdbc.Driver")要能执行成功,前提是 mysql-connector 的 jar 被添加到了运行时的 classpath。编译期 IDEA 帮你引了包,但运行时用的是输出目录的 classpath,两边不一致就会出现这个错。
解决:确认 jar 已经添加到 Project Structure → Libraries,并且「运行时也要用这个依赖」。如果是在命令行用 javac/java 手动跑,需要java -cp .;mysql-connector-java-5.1.49.jar 你的主类名这样指定 classpath。还有一个玄学场景:Windows 系统的 CLASSPATH 环境变量被以前的项目污染了,里面写了一个旧驱动路径,这种我见过一次,排查方式是把环境变量里的 CLASSPATH 清空再试。
4.2 Communications link failure 或 SSL 连接错误
现象:连接数据库时报Communications link failure,或者The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized,还有一种情况是SSL connection error: The server selected protocol version 50100 is not accepted by client.
原因:这个报错有两个源头。一个是 MySQL 8.0 之后时区默认不是 UTC,老驱动不认识;另一个是 MySQL 8.0 默认开启 SSL 加密,老驱动或者连接 URL 没配置 SSL 策略,握手阶段就断了。
解决:在 JDBC URL 后面拼接参数。
# 5.1.x 驱动连 MySQL 5.7 的写法 jdbc:mysql://localhost:3306/personnel?useUnicode=true&characterEncoding=utf8 # 8.0.x 驱动连 MySQL 8.0 的推荐写法 jdbc:mysql://localhost:3306/personnel?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&characterEncoding=utf8useSSL=false 是关掉 SSL 加密,课设环境里够用;serverTimezone=Asia/Shanghai 是把时区固定成东八区,解决时区识别失败;allowPublicKeyRetrieval=true 是 MySQL 8.0 用 caching_sha2_password 认证时需要的参数。这几个参数是 JDBC 连接 MySQL 8.x 的「后悔药」,贴上去能解决大半连接类报错。
注意:如果资源代码里写的是
com.mysql.jdbc.Driver而你要连 MySQL 8.0,最稳妥的方案是直接把驱动换成com.mysql.cj.jdbc.Driver并升级 jar 包到 8.0.x。部分老驱动在 MySQL 8.0 上即使加了参数也可能不稳定。
4.3 Unknown database:库名或初始化脚本没执行到位
现象:报java.sql.SQLException: Unknown database 'personnel',或者界面能打开但点登录就报这个错。
原因:数据库初始化脚本没执行,或者执行时选的库名和代码里写的 URL 不一致。很多课设脚本开头是CREATE DATABASE IF NOT EXISTS 库名,但你有可能是分步执行的,建表语句跑了、建库那行没跑。
解决:回到命令行确认库存在,不存在就重新完整执行一次 databaseproject.sql。还有一种情况是脚本里没有 CREATE DATABASE 这句,只有 USE 库名,此时你需要手动先建库再执行。
mysql -u root -p # 进入 MySQL 后手动建库 CREATE DATABASE IF NOT EXISTS personnel DEFAULT CHARSET utf8mb4; USE personnel; SOURCE /你的绝对路径/databaseproject.sql;4.4 中文乱码:表和界面各管各的字符集
现象:数据库里存的中文变成了「???」,或者 JTable 里显示的名字是乱码,但数据库命令行查出来是正常的。
原因:这是三层字符集不一致导致的。数据库连接 URL 没指定 characterEncoding、表结构是 latin1、IDEA 文件的编码不对,三个里任何一个出问题都会乱。
解决:数据库连接 URL 加上useUnicode=true&characterEncoding=UTF-8;MySQL 配置文件 my.cnf 或 my.ini 里设置character-set-server=utf8mb4;IDEA 右下角把项目文件编码改成 UTF-8。改完这三处重新建表、重新插入中文数据。这里有个血泪经验:修改表字符集只能保证新数据正确,已经乱掉的旧数据是救不回来的,必须清空重插。
5. 答辩前必做的三个升级:从「跑通」到「讲得清」
如果你不满足于让这个项目能运行,想在答辩或者面试时把它讲明白,我建议你做三件小事。
第一件,把 Statement 改成 PreparedStatement。课设资源里在登录、查询这两个场景经常直接拼接字符串写 SQL,虽然能跑,但你只要跟老师说「这里我改成预编译防注入」,印象分会明显不一样。改动本身很小:把Statement stmt = conn.createStatement()换成PreparedStatement ps = conn.prepareStatement(sql),把参数用?占位再setString。
第二件,把散落在各个类里的 JDBC 连接代码收拢到工具类。很多课设为了省事,每个 DAO 里都写一遍DriverManager.getConnection,你想改一次数据库密码得改十个文件。我一般会做一个 DBUtil 类,把连接参数集中管理。这个改动不涉及业务逻辑,但代码的「设计感」会一下子提上来。
第三件,做一次完整的「从零复现」测试。删掉数据库,重新执行 databaseproject.sql,重新启动程序,走一遍登录、增删改查的完整流程。这一步能暴露所有依赖初始化数据的问题——比如有的课设代码默认「部门表里已经有数据」,但你没执行 INSERT 语句,界面上的部门下拉框就是空的。我每次拿到新系统,第一件事永远是「能不能在一台干净机器上按步骤复现」,能复现才是真懂了。
从那以后,我每拆一个 Swing + JDBC 的项目,都会强制自己先确认三件事:MySQL 版本和驱动版本是否匹配、初始化脚本是否完整执行、JDBC URL 的参数有没有补齐。这三步走完,百分之八十的报错都已经提前排掉了。希望帮到你。
本文还有配套的精品资源,点击获取