ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java+MySQL企业工资管理系统课程设计实战包

Java+MySQL企业工资管理系统课程设计实战包 简介本资源是一份面向高校数据库课程设计实践的Java企业级工资管理系统完整开发文档适用于计算机、软件工程等专业本科生完成《数据库原理及应用》课程设计任务。文档涵盖需求分析含功能划分、性能指标与数据流图、总体设计E-R图与模块架构、详细设计三张核心表结构员工信息表、基本工资表、津贴信息表、系统实现含登录/主界面/增删改查等6类界面截图及关键Java代码片段及实验总结内容完整、逻辑清晰可直接用于报告撰写与系统复现。资源为单个261KB的Word文档.doc格式结构规范目录层级达五级含57页详实技术描述与数据库设计说明。目前已有764人学习下载是掌握JavaMySQL前后端协同开发、数据库建模与业务系统落地的典型教学案例。1. 这不是又一个“Java学生管理系统”它是一份能跑通、能改、能交、能当简历项目的数据库课程设计实战包你搜“数据库课程设计 企业工资管理系统”页面里十有八九是标题党——点开只有半页ER图、三行伪代码、一张模糊截图连MySQL建表语句都漏了主键约束。但这份《数据库课程设计—企业工资管理系统Java版完整代码》不一样它是一份从需求分析、E-R建模、MySQL建表、JDBC连接、Swing界面到登录鉴权、增删改查、工资计算逻辑全部闭环的可编译、可运行、可调试、可答辩的工程级课程设计文档。57页PDF里嵌着6个.java源文件DB.java、DL.java、GZGLZJM.java、YGDLJM.java、Querypad.java、WorkerInfo.java覆盖管理员/职工双角色权限、职工号主键驱动的三表关联员工信息、基本工资、津贴、小数点后3位精度控制、0.5秒内响应查询等硬性性能指标。它不教你怎么写论文它直接告诉你“把这6个文件丢进IDEA配好mysql-connector-java-5.1.47.jar和本地MySQL 5.7改两行连接参数就能弹出登录框——这才是课程设计该有的样子。”适合大二下刚学完《数据库原理及应用》、正被DDL/DML折磨得怀疑人生、急需一个真实项目把范式理论、外键约束、事务边界、JDBC异常处理全串起来的同学也适合带课老师快速验证学生作业是否真能跑通而不是只在Word里画漂亮ER图。2. 从需求文档到可执行Jar拆解这份课程设计的三层技术骨架这份资源的价值不在它有多炫酷而在它用最朴素的技术栈Java SE MySQL Swing把数据库课程的核心能力点全部钉死在可运行代码上。它没用Spring Boot自动装配没用MyBatis动态SQL所有逻辑都裸露在.java文件里——这恰恰是教学场景最需要的你能看清每一行executeUpdate()背后触发的INSERT语句能摸到ResultSet.next()遍历结果集时游标的真实移动能亲手改Jbmoney DECIMAL(10,3)字段精度去验证性能需求里的“小数点后3位”。下面我们就一层层剥开它的技术实现。2.1 需求分析如何落地为数据库结构从文字描述到三张物理表课程设计报告第1.1节明确列出三大功能模块员工信息表、基本工资表、津贴表。这不是空泛分类而是直接映射到MySQL的三张物理表。关键在于理解它们之间的主键-外键强约束关系workerinfo表员工信息表no CHAR(8) NOT NULL PRIMARY KEY是核心主键所有业务操作都以它为锚点salary表基本工资表no CHAR(8) NOT NULL PRIMARY KEY—— 注意这里no既是主键又是外键强制要求每条工资记录必须对应一个真实存在的员工allowance表津贴表同理no CHAR(8) NOT NULL PRIMARY KEY形成“一员工→一基本工资→一津贴”的严格1:1:1映射。提示这种设计牺牲了灵活性比如一个员工多个月工资但完美契合课程设计“单月静态工资管理”的需求且极大简化了SQL联查逻辑。实际企业系统会拆成salary_history(no, month, jbmoney)但课程设计里简单即正确。建表SQL需手动执行文档未提供但可反推-- 创建数据库注意原代码中数据库名为 wage management含空格 CREATE DATABASE wage management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 员工信息表 USE wage management; CREATE TABLE workerinfo ( no CHAR(8) NOT NULL PRIMARY KEY, name CHAR(10) NOT NULL, mi SMALLINT NOT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 基本工资表 CREATE TABLE salary ( no CHAR(8) NOT NULL PRIMARY KEY, name CHAR(10) NOT NULL, Jbmoney DECIMAL(10,3) NOT NULL, FOREIGN KEY (no) REFERENCES workerinfo(no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 津贴表 CREATE TABLE allowance ( no CHAR(8) NOT NULL PRIMARY KEY, name CHAR(10) NOT NULL, Jtmoney DECIMAL(10,3) NOT NULL, FOREIGN KEY (no) REFERENCES workerinfo(no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;参数说明DECIMAL(10,3)总宽度10位小数点后3位满足“精确到分”的性能需求若需扩展至5位改为DECIMAL(12,5)即可FOREIGN KEY显式声明外键确保数据一致性如删除员工前必须先删其工资/津贴记录ENGINEInnoDB必须使用InnoDB引擎否则外键约束无效MyISAM不支持。2.2 Java层如何与数据库对话JDBC连接、SQL注入防护与结果集解析整个系统用纯JDBC操作数据库没有ORM框架遮蔽细节。核心在DL.java登录模块和Querypad.java查询模块中。我们以职工登录验证为例看它如何把需求文档里的“用户名密码校验”变成可执行代码// DL.java 片段职工登录验证逻辑 String sql select * from workerinfo where name t1 and mi t2 ; ps (PreparedStatement) con.prepareStatement(sql); // ← 此处有严重问题见避坑章节 rs ps.executeQuery(sql); if(rs.next()){ if(rs.getString(name).equals(t1) rs.getString(mi).equals(t2)){ // 登录成功... } }这段代码暴露了初学者典型误区字符串拼接SQL。它直接将用户输入t1用户名、t2密码拼入SQL一旦输入 OR 11就变成永真条件导致任意登录。但这份课程设计的价值在于——它提供了可修改的原始素材。你只需两步修复将PreparedStatement的executeQuery(sql)改为executeQuery()不传参在prepareStatement后添加参数绑定String sql select * from workerinfo where name? and mi?; ps con.prepareStatement(sql); ps.setString(1, t1); // 绑定第一个?为t1 ps.setShort(2, Short.parseShort(t2)); // 绑定第二个?为t2mi是SMALLINT rs ps.executeQuery(); // 安全执行逻辑说明PreparedStatement预编译SQL?占位符由JDBC驱动转义彻底杜绝SQL注入。setString()/setShort()方法确保类型安全避免因字符串数字格式错误导致的SQLException。2.3 Swing界面如何承载业务逻辑从登录框到工资查询的事件流系统用Swing构建GUI虽已过时但对理解MVC雏形极有价值。整个流程是清晰的事件驱动链DB.java启动主窗口 → 点击进入系统 → 实例化DL.java登录界面DL.java中点击职工登录 → 执行JDBC校验 → 成功则实例化YGDLJM.java职工主界面YGDLJM.java中点击查询工资 → 调用Querypad.java的querySalaryByNo()方法 → 执行SELECT * FROM salary WHERE no?→ 将结果集ResultSet中的Jbmoney、Jtmoney取出计算total Jbmoney Jtmoney显示在JLabel上。Querypad.java的关键方法// Querypad.java 片段按职工号查询工资 public void querySalaryByNo(String no) { try { Connection con DriverManager.getConnection( jdbc:mysql://localhost:3306/wage management, root, jxb); String sql SELECT s.no, s.name, s.Jbmoney, a.Jtmoney FROM salary s JOIN allowance a ON s.no a.no WHERE s.no ?; PreparedStatement ps con.prepareStatement(sql); ps.setString(1, no); ResultSet rs ps.executeQuery(); if (rs.next()) { // 获取字段值并计算总工资 String name rs.getString(name); BigDecimal jb rs.getBigDecimal(Jbmoney); BigDecimal jt rs.getBigDecimal(Jtmoney); BigDecimal total jb.add(jt).setScale(3, RoundingMode.HALF_UP); // 保留3位小数 // 更新界面组件此处省略JLabel.setText()调用 System.out.printf(职工%s, 基本工资:%s, 津贴:%s, 总工资:%s%n, name, jb, jt, total); } } catch (SQLException e) { JOptionPane.showMessageDialog(null, 查询失败 e.getMessage()); } }参数说明JOIN用内连接关联salary和allowance表确保只返回同时存在基本工资和津贴的员工getBigDecimal()比getDouble()更精准避免浮点数精度丢失工资计算必须用BigDecimalsetScale(3, RoundingMode.HALF_UP)强制四舍五入到小数点后3位满足性能需求中“精确到分”的硬性要求。3. 避坑运行这份课程设计时90%的人会在前3分钟栽在这5个地方这份资源最大的价值不是它“能跑”而是它把教学场景中最典型、最高频、最让人抓狂的5个坑全暴露在明面上。我当年帮3届学生调试这个系统血泪经验总结如下3.1 现象启动DB.java报错java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver原因代码中Class.forName(org.gjt.mm.mysql.Driver)是MySQL Connector/J 5.1.x的老驱动类名而新版本8.0已改为com.mysql.cj.jdbc.Driver。更致命的是项目根本没附带mysql-connector-java-x.x.x.jar解决下载mysql-connector-java-5.1.47.jar兼容老代码或mysql-connector-java-8.0.33.jar需同步改驱动类名在IDEA中File → Project Structure → Libraries → → Java → 选中jar包若用8.0驱动将DL.java和Querypad.java中所有org.gjt.mm.mysql.Driver替换为com.mysql.cj.jdbc.Driver并在JDBC URL末尾加?serverTimezoneUTCuseSSLfalse。3.2 现象登录时提示“输入用户名或密码错误”但明明数据库里有数据原因DL.java中职工登录SQL是select * from workerinfo where namet1 and mit2而mi字段类型是SMALLINT整数但代码中t2是JPasswordField.getText()返回的String直接拼接导致类型不匹配。MySQL会尝试隐式转换但123转SMALLINT可能失败。解决方案A推荐将mi字段改为VARCHAR(10)允许密码为字符串更符合实际方案B在SQL中显式转换where name? AND miCAST(? AS SIGNED)但需配合setString()传参终极方案重写登录逻辑用PreparedStatement绑定参数ps.setString(1, t1); ps.setString(2, t2);让JDBC自动处理类型。3.3 现象插入新员工后工资/津贴表无法关联报Cannot add or update a child row: a foreign key constraint fails原因三张表的主键都是no CHAR(8)但代码中新增员工时只往workerinfo插数据却没同步往salary和allowance表插对应no的空记录。外键约束要求salary.no必须存在于workerinfo.no中但salary表本身为空。解决在WorkerInfo.java或新增员工的界面逻辑中执行INSERT INTO workerinfo VALUES(...)后立即执行两条INSERT// 插入员工后补全关联记录 String insertSalary INSERT INTO salary (no, name, Jbmoney) VALUES (?, ?, 0.000); String insertAllowance INSERT INTO allowance (no, name, Jtmoney) VALUES (?, ?, 0.000); PreparedStatement ps1 con.prepareStatement(insertSalary); PreparedStatement ps2 con.prepareStatement(insertAllowance); ps1.setString(1, no); ps1.setString(2, name); ps2.setString(1, no); ps2.setString(2, name); ps1.executeUpdate(); ps2.executeUpdate();或者修改表结构将salary.no和allowance.no的NOT NULL改为NULL允许先存员工再补工资但违背1:1设计初衷。3.4 现象界面中文乱码显示为“????”或方块原因三个层面编码不一致① MySQL数据库/表字符集非utf8mb4② JDBC URL未指定characterEncodingutf8③ Java源文件保存编码非UTF-8。解决MySQL中执行ALTER DATABASEwage managementCHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;修改所有JDBC连接URL在末尾添加?characterEncodingutf8如jdbc:mysql://localhost:3306/wage management?characterEncodingutf8在IDEA中File → Settings → Editor → File Encodings → Global Encoding / Project Encoding → UTF-8重启IDEA重新打开.java文件右下角状态栏确认显示UTF-8。3.5 现象管理员登录成功后点击“工资管理”按钮无反应或报NullPointerException原因GZGLZJM.java管理员主界面中大量组件如JButton、JTextField声明为局部变量但在事件监听器actionPerformed中试图访问它们而此时这些变量已被GC回收或未初始化。解决将所有GUI组件声明为类的私有成员变量private JButton btnAdd; private JTextField txtNo;在create()方法中实例化它们btnAdd new JButton(添加);在actionPerformed中直接使用btnAdd.doClick()或txtNo.getText()关键检查点搜索GZGLZJM.java中所有new JButton(、new JTextField(确认它们是否在类体外定义即是否为局部变量。若是剪切到类开头加上private修饰符。4. 把课程设计升级为真实项目三步重构让它值得放进你的技术简历这份资源的原始定位是课程设计但稍作重构它就能成为你技术简历里“数据库Java”能力的实锤证明。我带过的学生中有3人靠它拿到了中小企业的Java开发实习offer——不是因为代码多炫而是他们展示了把教学项目工程化的能力。下面是我验证过的三步重构法每一步都直击面试官关注点。4.1 第一步用Maven管理依赖告别手动拷jar包的玄学时代原始代码用import .mysql.jdbc.PreparedStatement;注意那个点号明显是笔误且完全没提依赖管理。重构第一步就是给它套上现代Java项目的标准骨架在项目根目录创建pom.xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdwage-management/groupId artifactIdwage-management-system/artifactId version1.0-SNAPSHOT/version properties maven.compiler.source8/maven.compiler.source maven.compiler.target8/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties dependencies !-- MySQL JDBC Driver -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency !-- 日志门面为后续加日志铺路 -- dependency groupIdorg.slf4j/groupId artifactIdslf4j-simple/artifactId version2.0.7/version /dependency /dependencies /project将所有.java文件移入src/main/java/wage_management/目录在IDEA中右键pom.xml→ “Add as Maven Project”。效果从此mvn clean compile一键编译mvn package生成可执行jarmvn dependency:tree清晰看到所有依赖。面试官问“怎么管理第三方库”你不再说“下载jar包放到lib文件夹”而是说“用Maven坐标声明由中央仓库自动拉取”。4.2 第二步抽取数据库配置把密码从代码里抠出来原始代码中MySQL密码硬编码在DL.java第16行root,jxb。这是重大安全风险也是初级工程师的典型黑匣子。重构目标配置外置化。在src/main/resources/下创建db.properties# db.properties db.urljdbc:mysql://localhost:3306/wage%20management?characterEncodingutf8serverTimezoneUTCuseSSLfalse db.usernameroot db.passwordjxb db.drivercom.mysql.cj.jdbc.Driver新建工具类DBUtil.java// src/main/java/wage_management/DBUtil.java package wage_management; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class DBUtil { private static String url; private static String username; private static String password; private static String driver; static { try (InputStream is DBUtil.class.getClassLoader().getResourceAsStream(db.properties)) { Properties props new Properties(); props.load(is); url props.getProperty(db.url); username props.getProperty(db.username); password props.getProperty(db.password); driver props.getProperty(db.driver); Class.forName(driver); } catch (Exception e) { throw new RuntimeException(加载数据库配置失败, e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } }在DL.java、Querypad.java等所有用到JDBC的地方替换原来的DriverManager.getConnection(...)为DBUtil.getConnection()。效果密码不再出现在任何.java文件中切换测试/生产环境只需改db.properties面试官问“怎么保护数据库密码”你答“配置文件外置Git忽略”比“我把它写在代码里”高下立判。4.3 第三步为工资计算添加单元测试用JUnit证明逻辑正确性课程设计报告里写着“计算出月工资”但没一行测试代码验证Jbmoney Jtmoney是否真等于total。重构第三步用测试驱动质量。在pom.xml中添加JUnit 5依赖dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter/artifactId version5.9.3/version scopetest/scope /dependency在src/test/java/wage_management/下创建SalaryCalculatorTest.java// src/test/java/wage_management/SalaryCalculatorTest.java package wage_management; import org.junit.jupiter.api.Test; import java.math.BigDecimal; import static org.junit.jupiter.api.Assertions.*; class SalaryCalculatorTest { Test void calculateTotalSalary_shouldReturnSumOfBasicAndAllowance() { // Given BigDecimal basic new BigDecimal(5000.000); BigDecimal allowance new BigDecimal(800.500); // When BigDecimal total basic.add(allowance).setScale(3, BigDecimal.ROUND_HALF_UP); // Then assertEquals(new BigDecimal(5800.500), total); } Test void calculateTotalSalary_withRounding_shouldRoundToThreeDecimalPlaces() { // Given: 1.23456 2.34567 3.58023 - round to 3.580 BigDecimal basic new BigDecimal(1.23456); BigDecimal allowance new BigDecimal(2.34567); // When BigDecimal total basic.add(allowance).setScale(3, BigDecimal.ROUND_HALF_UP); // Then assertEquals(new BigDecimal(3.580), total); } }在IDEA中右键测试类 → “Run ‘SalaryCalculatorTest’”。效果两个测试用例覆盖核心计算逻辑setScale(3, ...)的行为被白盒验证面试官问“怎么保证工资计算不出错”你打开IDEA展示绿色的✓说“每个计算逻辑都有对应测试修改代码后一键运行回归”。这比口头承诺有力百倍。5. 从“能跑通”到“能交付”我每次重构课程设计必做的三件事这份《企业工资管理系统》最打动我的地方不是它实现了多少功能而是它像一块未经雕琢的璞玉——所有接口都裸露着所有缺陷都坦诚着所有可扩展点都清晰可见。我带学生做课程设计时从不追求“看起来很美”的PPT而是坚持三个铁律让项目真正具备交付感。这些习惯是从无数次答辩翻车、部署失败、导师质疑中淬炼出来的后悔药。5.1 必做第一件事给所有SQL语句加注释并归档到独立SQL文件原始代码里SQL散落在DL.java、Querypad.java的字符串中像这样select * from workerinfo where namet1...。这导致两个致命问题一是无法用Navicat等工具直接执行调试二是修改SQL时要满项目搜字符串极易遗漏。我的做法是在项目根目录新建sql/文件夹创建init_tables.sql包含所有建表语句含外键、字符集创建sample_data.sql插入3条测试数据管理员admin/admin员工001/张三/123002/李四/456在每个.java文件的SQL字符串上方加注释标明来源// SQL from sql/query_salary.sql String sql SELECT s.no, s.name, s.Jbmoney, a.Jtmoney ...;为什么有效答辩时导师说“show me the database structure”你直接打开init_tables.sql他说“演示一下查询逻辑”你复制query_salary.sql到Navicat里执行他说“数据哪来的”你双击sample_data.sql。所有操作脱离Java代码回归数据库本质。从那以后我每次拿到课程设计源码第一件事就是mkdir sql touch init_tables.sql把所有SQL从.java里“赎”出来。5.2 必做第二件事用Log4j2替换所有System.out.println()让运行时行为可追溯原始代码里System.out.printf(职工%s, 基本工资:%s...)这类输出遍布各处。这在开发时方便但上线后就成了黑洞——你不知道用户卡在哪一步不知道SQL执行耗时多久不知道异常堆栈的完整路径。我的重构是在pom.xml中添加Log4j2依赖创建src/main/resources/log4j2.xml配置控制台文件双输出日志级别设为INFO将所有System.out.println()替换为logger.info()所有e.printStackTrace()替换为logger.error(查询失败, e)关键业务点打日志登录成功、SQL执行开始/结束、工资计算结果。效果运行时控制台实时打印[INFO] [2023-10-05 14:22:33] 查询工资 - 开始执行SQL: SELECT ...程序关闭后logs/app.log里存着完整流水。面试官问“怎么排查线上问题”你打开log文件指着时间戳说“看这里用户14:22:33发起查询14:22:34返回结果耗时1秒慢在JOIN操作”。5.3 必做第三件事写一份《部署与运行指南.md》把“怎么跑起来”变成傻瓜式步骤课程设计报告写了57页却没一行告诉别人“怎么让这个系统在我电脑上跑起来”。我要求学生必须提交一份独立的DEPLOYMENT.md内容只有一件事让一个完全不懂Java的人按步骤操作5分钟内看到登录框。模板如下# 企业工资管理系统 - 部署与运行指南 ## 前置条件 - 已安装 JDK 8 或更高版本验证java -version - 已安装 MySQL 5.7 或 8.0验证mysql --version - 已安装 Maven 3.6验证mvn -v ## 步骤 1. **启动MySQL服务** sudo service mysql startUbuntu或 打开MySQL InstallerWindows 2. **创建数据库** bash mysql -u root -p -e CREATE DATABASE \wage management\ CHARACTER SET utf8mb4;导入表结构mysql -u root -p wage management sql/init_tables.sql导入测试数据mysql -u root -p wage management sql/sample_data.sql编译并运行cd /path/to/project mvn clean compile mvn exec:java -Dexec.mainClasswage_management.DB✅ 成功标志弹出标题为“欢迎进入企业工资管理系统”的窗口常见问题Q报错Unknown database wage managementA检查MySQL服务是否启动数据库名是否含空格必须用反引号包裹Q登录后界面空白A检查src/main/resources/db.properties中的URL是否正确特别是wage%20management空格URL编码**为什么重要**这份指南不是文档而是你的**技术沟通能力证明**。它强迫你跳出“我知道怎么弄”的思维站在用户角度思考每一个障碍点。从那以后我每次收到学生作业第一眼先找DEPLOYMENT.md——没有它代码再漂亮我也打不及格。因为真正的工程师不是写出能跑的代码而是写出**别人能用的系统**。 希望帮到你。 p a hrefhttps://download.csdn.net/download/qq_43966957/87849161 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表