资讯详情

Java企业工资管理系统课设:从数据库设计到Swing界面实现

📅 2026/10/10 13:31:12 | 华诺云谱 👁 阅读
Java企业工资管理系统课设:从数据库设计到Swing界面实现
简介这是一份面向数据库原理及应用课程的Java企业工资管理系统课程设计报告适合计算机相关专业学生完成课程设计或毕业设计时参考。报告按标准流程展开从需求分析、数据流图与E-R图设计到数据库逻辑表结构、功能模块划分再到界面开发与JavaMySQL实现覆盖员工信息管理、基本工资设定、津贴管理、月工资计算和登录查询等典型场景并配有界面截图和核心代码片段结构完整、可直接对照学习。资源为1个doc格式文档压缩包大小约261KB包含全流程报告说明、数据库建表字段设计、功能模块讲解及主要Java源码便于读者快速把握系统实现思路并在此基础上改造复用。已有766人学习下载适合需要撰写数据库课程设计报告或搭建工资管理项目的读者。1. 数据库课程设计选企业工资管理系统一份能直接跑的 Java 课设蓝本如果你正在为数据库课程设计发愁选题又是企业工资管理系统那这份 Java 版 完整代码的资源确实能省掉不少从零搭框架的时间。它把需求分析、数据流图、E-R 图、数据库逻辑设计和 Swing 源码收进一份 doc 里功能定义得很清楚员工信息、基本工资、津贴三类操作对应三张表。适合想先跑起来再往里面加东西的人。我拿到后的第一反应是这代码虽然学生气很重但结构够直白作为课设蓝本完全够用不用怕看不懂。2. 需求分析与模块设计评阅老师看报告最先翻的三页课设报告的前三页基本决定了第一印象这份资源把功能需求、性能需求和数据流图按顺序排好了。第 1 章功能需求部分把系统拆成三块员工信息表及时反映基本信息员工津贴表反映津贴员工基本工资表存基本工资。对应的功能描述是基本工资设定、津贴设定、计算出月工资、录入员工工资信息、添加工资信息和更改工资信息。从实现角度看这里有个明显缺口后面模块里出现了“删除”和“查询”但功能描述列表没有明确写出来。答辩时老师很可能问“你的删除按钮对应需求里哪一条”照着文档读会卡住。我一般会在报告里补一句“支持对员工工资信息进行查询、修改与删除”把增删改查写完整。2.1 功能划分三张表对应三类操作把功能划分落到表结构上系统的主干就清楚了。员工信息表负责职工号、姓名、登录密码这是登录模块的数据来源基本工资表负责每个员工的固定工资津贴表负责奖金或补贴。后面的工资计算其实就是“基本工资 津贴”的组合。文档没有给出具体的计算公式这是最大的疏漏。常见做法是补一行公式实发工资 基本工资 津贴 - 请假扣款 - 社保。就算代码里没有真正的计算逻辑报告里有这条公式也可以应付“怎么算工资”的提问。做课设不是写生产系统老师看的是你有没有完整思考过程。这版功能划分还有一个特点把管理员和员工两类角色分开。文档里“职工登录模块”和“员工管理模块”是两个独立模块管理员能做录入、修改、删除员工只能查询自己的工资和修改密码。这种角色划分直接决定了后面登录界面的双通道设计也决定了数据表的访问级别。写到需求分析时最好用一张表格把“角色 × 权限”列出来管理员对员工表和工资表有增删改权限员工对自己只有查询权限这样报告会显得逻辑闭合。另外注意数据流图里出现过“考勤信息载入”但功能需求里没有考勤模块这也是前后不呼应的地方建议要么把考勤从图里删掉要么在功能描述里提一句“预留考勤接口”否则容易被追问。2.2 数据流图与 E-R 图先画主链再补外键文档里提到第一层数据流图、职工信息载入和考勤信息载入但正文中图只有编号没有实际图片下载的 doc 里需要自己去补。这里有个容易被忽略的细节数据流图应当从外部实体开始用户或财务发出请求经过登录、查询、修改等处理最终落到数据存储。画三个图就够顶层图、职工信息处理图、工资查询处理图。顶层图只需画出用户、财务、系统三个外部实体和处理框第二层再展开职工信息的载入、修改、删除处理。工具用 draw.io 或 Visio 都行关键是每个图配一两句文字说明别让图孤立地摆在页面上。E-R 图是第二章的核心。文档给出的实体关系是员工、工资、津贴员工与工资 1:1员工与津贴 1:1。这里 1:1 的设计只适合“每个员工当前只有一条工资记录”的简化场景如果做成按月发放员工和工资应该是 1:N。我建议在答辩前主动说明“当前版本按当前月份设计扩展月薪记录时只需给工资表加月份字段”这句话能把 1:1 的短板变成你思考过的证据。E-R 图里员工实体的属性至少要有职工号、姓名、密码工资实体要有职工号、基本工资津贴实体要有职工号、津贴金额联系用菱形框主键字段标下划线。图的布局不用花哨清晰可读排在第一位。2.3 性能需求怎么写精度、响应时间与平台兼容性文档写性能需求时定了三个硬指标工资数据精度默认保留小数点后 3 位最大 5 位用户命令的服务器响应时间不超过 0.5 秒系统支持多种操作系统包括 Linux保证数据互通。这三个指标在课设报告里很常见但代码并没有专门实现“可配置小数精度”。这里的落地策略是数据库使用 DECIMAL 类型保证精确存储前端展示时用 DecimalFormat 控制小数位数。比如new DecimalFormat(#0.00).format(salary)就能让界面统一显示两位小数但财务计算中间值不要用 double用 BigDecimal 更稳。响应时间 0.5 秒对几十条记录的 MySQL 表来说完全没有压力但当表数据量变大时就需要给职工号建索引这是可以写在报告里的优化点。课程设计里给 no 字段加 PRIMARY KEY 本身就会建索引所以这条直接说“主键索引保证等值查询在毫秒级”就够。跨平台这一点是 Java Swing 自带的优势JDK 装到 Linux 一样能跑。但要注意图片路径和数据库连接串不要写死绝对路径否则换到 Linux 环境就翻车。把数据库地址、账号、密码放到一个 properties 配置文件里运行时读取这是从课设到真实项目的第一步升级。3. 数据库逻辑设计三张表的字段、类型与外键怎么定数据库设计是课设最容易出彩的部分也是跑不起来时最想退货的地方。这份资源在总体设计部分给出了关系模式员工职工号密码、工资职工号基本工资、津贴职工号奖金下划线字段为主键。乍一看很干净实际建表时你会发现几个隐蔽问题工资表主键直接用了职工号说明一个员工只有一条工资记录工资表和津贴表都重复存了姓名字段类型里出现了 SQL Server 风格的 moneyMySQL 并不认识。逐条拆开看这章才是决定你能不能跑通的关键。3.1 关系模式转换主键选择与表间冗余先讲主键。文档把三张表的主键都定为职工号这在关系模式上是“员工与工资 1:1员工与津贴 1:1”的表现。如果你要坚持 1:1代码写起来最简单登录时查出 workerinfo再根据职工号去 base_salary 表取工资即可。可一旦系统要支持历史工资记录就得把工资表主键改成职工号, 月份的组合键否则每个月的数据会互相覆盖。我做课程设计时一般保留文档的简化设计但在结论部分写一句“本设计仅记录当前月工资如需历史记录可将工资表主键扩为职工号月份”这句话的成本极低却能展示你理解了这个局限。冗余的 name 字段也值得说一下。文档里工资表和津贴表都放了职工姓名从范式角度看是冗余因为姓名能通过 workerinfo 查到。但课设代码往往赶时间冗余姓名可以少写一次 JOIN。如果答辩被问到为什么冗余可以直接答“为了查询性能和界面展示方便以职工号作为外键保证一致性”。这个回答比“不知道”好很多。另外文档里表二和表四之间跳过了表三排版有点乱你拿到 doc 后不要被表号干扰按字段内容对应到三张表就行这不影响实际使用。3.2 建表 SQL把 money 换成 DECIMAL把表名统一先看文档里给出的表结构员工信息表字段为 no CHAR(8) 主键、name CHAR(10)、mi SMALLINT基本工资表为 no 主键、name、jb money津贴表为 no 主键、name、jt money。这里有几个真正的坑CHAR(10) 存中文姓名会在尾部补空格查询时容易遇到“明明有数据却匹配不上”mi 用 SMALLINT 意味着密码只能是小范围数字超过 32767 就会报 out of rangemoney 类型是 SQL Server 的MySQL 要用 DECIMAL。我把文档中的表结构整理成下面这份可直接执行的 SQL建库名和表名都按 wage_management 统一避免出现代码里连接串带空格的隐患。CREATE DATABASE IF NOT EXISTS wage_management DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE wage_management; CREATE TABLE workerinfo ( no CHAR(8) NOT NULL, name VARCHAR(20) NOT NULL, mi SMALLINT NOT NULL, PRIMARY KEY (no) ); CREATE TABLE base_salary ( no CHAR(8) NOT NULL, name VARCHAR(20) DEFAULT NULL, jb DECIMAL(10,2) NOT NULL, PRIMARY KEY (no), CONSTRAINT fk_base_worker FOREIGN KEY (no) REFERENCES workerinfo(no) ); CREATE TABLE allowance ( no CHAR(8) NOT NULL, name VARCHAR(20) DEFAULT NULL, jt DECIMAL(10,2) NOT NULL, PRIMARY KEY (no), CONSTRAINT fk_allow_worker FOREIGN KEY (no) REFERENCES workerinfo(no) );这段 SQL 的要点在于库和表都用 utf8mb4这是解决中文乱码的前提name 用 VARCHAR(20) 而不是 CHAR(10)避免空格补齐jb 和 jt 用 DECIMAL(10,2)最大 99999999.99足够覆盖工资和津贴两个子表都加了外键约束指向 workerinfo 的职工号。外键在课设里是加分项但也会带来一个实际约束必须先插入员工再插入工资和津贴删除时顺序相反。这个顺序后面初始化数据会用到如果反过来插入会直接报“外键约束失败”。3.3 初始化数据插入两个测试员工打通登录流程数据库建好之后第一件事是插入测试数据否则登录和查询全是空的。文档代码里职工登录执行的是select * from workerinfo where name... and mi...所以 workerinfo 表必须提前有数据。注意 mi 字段是 SMALLINT最大值只有 32767如果你往里面插 123456 会报 out of range这是很多人第一次跑课设翻车的点。下面这组数据把密码设成 1234 和 5678刚好在 SMALLINT 范围内INSERT INTO workerinfo (no, name, mi) VALUES (1001, 员工甲, 1234), (1002, 员工乙, 5678); INSERT INTO base_salary (no, name, jb) VALUES (1001, 员工甲, 6500.00), (1002, 员工乙, 4800.00); INSERT INTO allowance (no, name, jt) VALUES (1001, 员工甲, 800.00), (1002, 员工乙, 200.00);插入顺序按外键要求先员工后工资和津贴。这里把员工甲的津贴设为 800员工乙设为 200是为了演示时拉开差距方便展示“每位员工工资不同”。初始化数据做完后可以直接在命令行跑一条select * from base_salary b join allowance a on b.noa.no验证三表关系。很多同学会忽略这一步结果代码里查不到数据还以为是数据库配置错了其实只是表是空的。4. Java Swing 实现与运行步骤从登录界面跑到职工查询这份资源的代码部分以 Java Swing 为主包名 wage_management入口是 DB.java登录窗口是 DL.java。Swing 技术本身已经“过时”但不“过气”课程设计用它最大的好处是界面代码直白老师能看懂、学生能改不需要引入 Maven、Spring 这类依赖。坏处则是如果你照抄文档里的原代码大概率会遇到 import 残缺、PreparedStatement 用法错误、图片路径失效等问题。我下面按“可复现”的标准把核心代码重写一遍并标注与原文的差异。4.1 项目结构与启动入口先跑通 DB.javaDB.java 负责显示欢迎界面和两个按钮进入系统、退出系统。原版代码用了 ImageIcon(1.jpg) 做背景那行代码本身没问题问题在运行时工作目录不是项目根目录图片经常找不到我就直接在示例里去掉了背景图。启动类可以用下面这种写法package wage_management; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class DB extends JFrame implements ActionListener { private JButton enterBtn new JButton(进入系统); private JButton exitBtn new JButton(退出系统); public DB() { setTitle(欢迎进入企业工资管理系统); setLayout(new FlowLayout()); add(enterBtn); add(exitBtn); enterBtn.addActionListener(this); exitBtn.addActionListener(this); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(200, 100, 550, 180); setVisible(true); } Override public void actionPerformed(ActionEvent e) { if (e.getSource() enterBtn) { new DL().create(); dispose(); } else if (e.getSource() exitBtn) { System.exit(0); } } public static void main(String[] args) { new DB(); } }这里 setBounds(200, 100, 550, 180) 前两个参数是窗口左上角坐标后两个是宽和高FlowLayout 让按钮水平排列是 Swing 最简单的布局方式。动作监听里区分了 enterBtn 和 exitBtn进入系统后打开 DL 登录窗口并关闭当前窗口退出则直接调用 System.exit(0)。注意我在示例里保留了dl.create()这个写法是为了贴近原文档的 DL 类结构你也可以把 create() 里的代码合并到构造器里。运行步骤就三步新建 Java 项目把 DB.java 和 DL.java 放进 wage_management 包再把 mysql-connector-java 的 jar 加到类路径最后运行 DB 的 main 方法。如果你用的是 JDK 8以上代码编译零报错JDK 11 以后要留意 Swing 的字体和高分屏适配那是界面显示问题不是代码错误。4.2 登录验证修复 PreparedStatement 用法的完整代码原版 DL.java 里登录逻辑有两个致命问题。第一个是import .mysql.jdbc.PreparedStatement;这行开头少写了一个 java直接复制会编译失败。第二个是把 PreparedStatement 当 Statement 用ps.executeQuery(sql)这种带参调用只存在于 Statement 接口PreparedStatement 里没有这个方法运行时会报错。我实际搭这个项目时会这样重写职工登录校验package wage_management; import java.sql.*; public class LoginService { public boolean checkWorker(String account, String pwd) { String url jdbc:mysql://localhost:3306/wage_management ?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; String sql SELECT no, name, mi FROM workerinfo WHERE name ? AND mi ?; try (Connection con DriverManager.getConnection(url, root, 你的密码); PreparedStatement ps con.prepareStatement(sql)) { ps.setString(1, account.trim()); ps.setString(2, pwd); try (ResultSet rs ps.executeQuery()) { return rs.next(); } } catch (SQLException e) { e.printStackTrace(); return false; } } }这段代码用了 try-with-resources连接、语句、结果集都会自动关闭不会像原版那样开着连接不释放。PreparedStatement 用 ? 占位setString 传入账号和密码从根上避免了 SQL 注入这也是一句能在答辩时说的安全点。账号处 account.trim() 是为了防止用户手滑输入空格pwd 直接按字符串传入MySQL 会自动把 SMALLINT 字段和字符串比较实际演示没问题。如果你更严谨一点可以在这里把 pwd 解析成 int 再 setInt但要注意 Integer.parseInt 遇到非数字字符会抛异常课设里没必要给自己挖坑。管理员登录不走 workerinfo 表而是代码里硬编码 admin/admin原文档就是这么设计的。这个写法确实很初级如果你想让报告更完整可以把管理员账号也存进数据库登录时统一走 PreparedStatement 查询。但考虑到课设演示时间有限硬编码反而不会因为数据库没插管理员数据而失败我建议保留原设计同时在答辩时说清“这是为了演示方便真实系统应做加密存储”。4.3 主窗口与功能跳转管理员和职工两条操作路径登录成功后管理员进入 GZGLZJM职工进入 YGDLJM这两个类的完整源码在文档中并没有完整贴出界面截图倒是给了参考。管理员窗口按功能描述应该包含员工信息管理、工资管理和津贴管理三块职工窗口则只有个人工资查询和密码修改。如果你打算自己补全这两个类最简单的是用 JTabbedPane 放三个页签每个页签一个 JTable。往 JTable 里填数据是课设几乎必写的代码我一般这样写DefaultTableModel model new DefaultTableModel( new String[]{工号, 姓名, 基本工资, 津贴}, 0); JTable table new JTable(model); // rs 来自 base_salary 与 allowance 的 JOIN 查询 while (rs.next()) { model.addRow(new Object[]{ rs.getString(no), rs.getString(name), rs.getBigDecimal(jb), rs.getBigDecimal(jt) }); }DefaultTableModel 的构造参数第一行是列名数组第二行的 0 表示初始行数为空addRow 每次追加一行数据源可以是 ResultSet。rs.getBigDecimal 读取 DECIMAL 字段不会出现 double 的精度误差。如果津贴表里没有记录getBigDecimal(jt) 会返回 null界面上会显示 null解决方法是在取值后判空替换成 0.00。这个小细节很容易被忽略但演示时一旦出现评阅老师会认为你连空数据都没处理。5. 避坑记录JDBC、乱码和图片路径的五个常见问题这个项目代码量不大但让它在自己的电脑上跑起来要踩的坑大多集中在数据库环境上。下面这几条是我按“现象 → 原因 → 解决”整理的照着排查能省下大半天。5.1 JDBC 驱动与连接串问题现象 1运行登录按钮时抛 ClassNotFoundException异常指向 org.gjt.mm.mysql.Driver。原因这个驱动类名属于 MySQL Connector/J 5 之前的旧版本新版驱动已经改名。解决换成Class.forName(com.mysql.cj.jdbc.Driver)这是 MySQL 8.x 的标准驱动类如果用 5.x 驱动用com.mysql.jdbc.Driver也可以。注意新版驱动还会要求设置 serverTimezone否则报时区错误。这里要补一句原理org.gjt.mm.mysql 是早年 MySQL 驱动包里的包名新驱动包已经把类挪到 com.mysql.cj.jdbc 下。你如果从网上下到的是最新版 mysql-connector-java-8.x.jar就必须用新名字没有商量余地。驱动选型跟着驱动 jar 版本走别只看代码示例。现象 2连接串照抄文档写成jdbc:mysql://localhost:3306/wage management启动后报 Unknown database。原因数据库名带了一个空格MySQL 不认识这个库。解决把库名统一为 wage_management连接串写成jdbc:mysql://localhost:3306/wage_management?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8。这条坑几乎是文档原样的翻车点我看到连接串里有空格时就知道这里迟早要炸。连接串里的参数各有用处整理成一张表方便以后复用参数示例值作用useSSLfalse本地调试时避免 SSL 握手失败serverTimezoneAsia/Shanghai解决 MySQL 8 时区报错characterEncodingutf8解决中文乱码allowPublicKeyRetrievaltrue使用 caching_sha2_password 时避免连接失败后面两个参数不是必须但本地调试时经常要加上。你可以在连接串里一次性写好省得遇到一个加一个。5.2 界面、编码与依赖问题现象 3插入员工数据时提示 out of range value for column mi。原因workerinfo 的 mi 字段是 SMALLINT范围只有 -32768 到 32767文档里用 123456 做密码就溢出了。解决把测试密码改成 1234、5678 这类区间内的数字或者把字段类型改成 INT。课程设计里改字段类型是常事不需要守着小整数不放。这里多说一句workerinfo 表里 mi 是登录密码字段用数字存密码本身就不安全也没有加密。课设里可以接受但你心里要清楚真实系统密码不可能用明文小整数存。答辩时如果被问就说“当前为演示需要生产环境应改为加盐哈希”。这种回答能体现你分得清课程设计和企业实践的区别。现象 4登录窗口背景图显示不出来只看到按钮和输入框。原因new ImageIcon(1.jpg)用的是当前工作目录的相对路径IDEA 里运行的工作目录通常是项目根目录不是 src找不到图片。解决把 1.jpg、2.jpg 放到项目根目录才能命中更稳妥的是用new ImageIcon(getClass().getResource(/1.jpg))从 classpath 读取只要图片在资源目录里就不会丢。图片路径的问题是 Swing 课设的高频现场翻车点。按相对路径读你换一台电脑、换一个 IDE甚至换一个启动方式路径就可能失效。把图片放进 src 下的 resources 目录用 getResource 读取等于帮自己买了一份后悔药。当然如果你完全不需要背景图直接去掉 ImageIcon 那两行最省事。现象 5界面上中文全是问号或乱码数据库里也是乱码。原因建库时没有指定字符集连接串也没有带 characterEncodingutf8。解决建库 SQL 加上DEFAULT CHARACTER SET utf8mb4连接串加上characterEncodingutf8两个必须同时满足。只改一个另一个照样出乱码这是我调课设时验证过很多次的组合。最后再补两条非逻辑坑文档里那行残缺的import .mysql.jdbc.PreparedStatement必须删除改成import java.sql.PreparedStatementIDE 里如果提示 Connection、ResultSet 找不到先检查 mysql-connector-java.jar 有没有加入 Build Path。这两条不是逻辑问题但会影响你能否编译通过。建议拿到代码后第一件事就是把这些残留的 import 清理干净再跑编译。6. 验证与进阶答辩前把课设变成演示项目6.1 三分钟验收清单与两个进阶改造我习惯在答辩前一天强制走一遍完整流程管理员登录 admin/admin → 新增一名员工 → 给该员工插入基本工资和津贴 → 退出 → 职工登录查询工资 → 修改密码。每一步截一张图插到课程设计报告的“系统实现”部分。这张验收清单能同时覆盖登录、增删改查、查询、权限这四类高频答辩点演示时不容易冷场。如果想再拿高一点分可以做两个低成本改造。第一给 base_salary 表加一个 month 字段主键改成 (no, month)这样同一员工可以存多个月工资E-R 图从 1:1 变成 1:N正好回应“为什么这么设计”。第二把所有自己拼接的 SQL 换成 PreparedStatement 参数化查询答辩被问到安全性时直接说“通过预编译语句防止 SQL 注入”。这两个改动半天就能完成但会让整个项目的完整度上一个大台阶。我帮 A 同学调这个项目时最后发现卡住他的就两处JDBC 驱动类名和连接串里的库名。从那以后我每次拿到课设资源第一件事就是检查驱动类名、URL 里的数据库名和 PreparedStatement 的写法这三样没有问题再跑主类几乎不再遇到玄学问题。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑