Java Swing + MySQL 运动会管理系统课设:从环境搭建到全能赛总分排序
简介这是一套面向高校计算机与数据库课程学习者的Java Swing桌面应用实战项目以田径运动会管理为业务场景适合正在完成数据库课程设计或Java综合实训的学生参考。系统围绕运动员、参赛团体、比赛安排与裁判信息管理展开支持按编号或姓名模糊查询并实现全能赛成绩录入、总分计算与排序、团体金牌统计等功能同时对数据合法性校验、查询无结果及数据库连接异常均给出提示。资源包共74个文件约2.2MB包含12个java源码、48个class编译文件、5个xml配置、1个sql建库脚本以及课程设计报告docx文档另附jar依赖与工程配置文件可直接导入IDEA或Eclipse配合MySQL5.7以上运行。目前已有188人学习下载读者可借此获得完整的需求分析、数据库表结构、Swing界面实现与课设报告范文便于快速理解项目结构并完成自己的课程作业。1. 从一份课设压缩包说起Java Swing MySQL 运动会管理系统能跑出什么如果你正在找一份能直接跑起来、还带课程报告的 Java 课设这个基于 Java Swing MySQL 的田径运动会管理系统值得先看一眼。它不是那种只有几个空壳窗体的演示项目而是把运动员、参赛团体、比赛安排、裁判信息、成绩录入与统计串成了一条完整业务线管理员登录后录入数据系统校验完整性按项目模糊查询录入全能赛成绩后自动算总分并排序还能统计各团体金牌数。技术栈是典型的 Java SE 路线——Swing 做桌面界面JDBC 直连 MySQL没有 Spring 那一套对刚学完 Java 基础、面向对象编程和 MySQL 事务处理的同学来说改起来门槛低。压缩包里除了 src 源码还有 sports_meet.sql 建库脚本、课设报告 docx 和一份必读.txt基本覆盖了从建库到跑通再到写报告的完整链路。适合谁正在做数据库课设、Java 课设或者想拿一个真实可跑的 Swing 项目练手 JDBC 与事件驱动的人。2. 环境准备与工程导入把压缩包变成能跑的工程2.1 JDK、MySQL 与 IDE 的版本对齐这个项目对版本不算挑剔但有几个硬性前提。JDK 用 8 或 11 都行再高也不是不能跑只是 Swing 在高版本 JDK 上偶尔会有字体渲染差异课设场景没必要折腾。MySQL 要求 5.7 以上常见做法是直接用 5.7.44 或 8.0注意 8.0 的驱动类名和连接串参数跟 5.7 有区别后面会讲。IDE 用 IDEA 或 Eclipse 都可以压缩包里同时带了 .idea、.classpath、.project、.settings说明作者两种都配过。导入时有个细节如果你用 IDEA 打开它会识别 .idea 目录如果用 Eclipse它会读 .classpath 和 .project。不要两个 IDE 同时打开同一个目录否则配置文件会互相覆盖这是血泪经验。导入后先别急着运行检查 Project Structure 里的 SDK 是否指向你本机的 JDKLanguage Level 设成 8 或对应版本。2.2 导入 sports_meet.sql 并核对字符集建库是第一步也是最容易翻车的地方。用命令行或 Navicat 都行命令行更稳# 登录 MySQL注意 8.0 和 5.7 的登录方式一致 mysql -u root -p # 创建数据库并指定字符集避免中文乱码 CREATE DATABASE sports_meet DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 切换到该库 USE sports_meet; # 导入脚本路径换成你解压后的实际位置 source /path/to/sports_meet.sql;这段命令的逻辑是先建一个明确用 utf8mb4 的库再执行脚本。为什么要手动指定字符集因为如果 MySQL 服务端默认是 latin1脚本里的中文运动员姓名、团体名会变成问号而且这种乱码在 Swing 界面里排查起来很费劲。导入完成后执行SHOW TABLES;应该能看到运动员、团体、比赛、裁判、成绩等几张表。如果表数量不对说明脚本没执行完检查 source 路径里有没有空格或中文。2.3 修改数据库连接配置源码里连接数据库的代码通常集中在一个工具类常见命名是 DBUtil 或 DBHelper。打开 src 目录找带 getConnection 字样的类。需要改的是 URL、用户名、密码三项// 常见写法注意 8.0 与 5.7 的差异 private static final String URL jdbc:mysql://localhost:3306/sports_meet?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 你的密码; // 加载驱动8.0 用 com.mysql.cj.jdbc.Driver5.7 用 com.mysql.jdbc.Driver Class.forName(com.mysql.cj.jdbc.Driver);参数逐个说清楚useUnicode 和 characterEncoding 保证中文正常传输useSSLfalse 是本地开发常用做法避免 MySQL 8.0 默认要求 SSL 导致的连接错误这也是热搜里 mysql ssl 连接错误的高频原因serverTimezone 必须设否则 8.0 驱动会报时区异常。驱动类名如果写错启动时会抛 ClassNotFoundException这时候先确认 lib 目录下的 mysql-connector-java 版本5.x 的包用旧类名8.x 的包用 cj 类名别混用。2.4 在 IDE 里配置依赖并启动主类lib 目录里放的就是 MySQL 驱动 jar。IDEA 里右键该 jar选择 Add as LibraryEclipse 里右键项目 Build PathAdd External JARs。配置完检查一下有没有报红。主类一般叫 Main 或 LoginFrame找带 main 方法的那个右键 Run。如果登录窗口弹出来说明环境通了。第一次登录用管理员账号账号密码通常在必读.txt 或报告里写着别自己瞎猜。3. 核心功能拆解录入校验、模糊查询与全能赛总分排序3.1 数据录入的完整性校验逻辑这个系统在录入运动员、团体、比赛安排时会检查数据是否完整合法不合法要提示出错原因。这是课设里比较容易被忽略但很能体现面向对象编程思想的部分。常见做法是在实体类之外写一个校验方法或者在 DAO 层插入前判断。以运动员录入为例// 伪代码示意实际类名以源码为准 public String validateAthlete(Athlete a) { if (a.getNumber() null || a.getNumber().trim().isEmpty()) { return 运动员编号不能为空; } if (a.getName() null || a.getName().trim().isEmpty()) { return 运动员姓名不能为空; } // 编号只允许字母和数字对应热搜里 java 判断字符串是否不是字母和数字 if (!a.getNumber().matches([A-Za-z0-9])) { return 运动员编号只能包含字母和数字; } return null; // 返回 null 表示校验通过 }逻辑说明校验方法返回字符串null 代表通过非 null 就是错误提示界面层拿到提示直接弹窗。参数上编号和姓名是必填编号还做了字符集限制。这种设计比抛异常更友好因为 Swing 里弹窗展示异常堆栈很难看。如果你要扩展比如加性别、年龄范围校验照着这个模式加分支就行。注意别把校验写死在按钮事件里抽出来才能复用。3.2 按项目模糊查询的实现查询采用按项目模糊查询比如查运动员可以按编号或姓名模糊匹配。核心是 SQL 里的 LIKE 拼接// 按姓名模糊查询运动员 String sql SELECT * FROM athlete WHERE name LIKE ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, % keyword %); ResultSet rs ps.executeQuery();用 PreparedStatement 而不是字符串拼接一是防注入二是处理中文和特殊字符更稳。参数里的百分号是通配符前后都加表示包含关键词即可。查询无结果时界面要有提示别让用户对着空表格发呆。常见坑是关键词里本身带百分号或下划线这时候要做转义课设场景可以先不处理但你要知道这个边界。模糊查询在数据量小的时候无所谓数据量大了要加索引这是后话。3.3 全能赛成绩录入与总分排序全能赛是这个系统里逻辑最重的一块录入各单项成绩后要算总分并排序。常见做法是每个单项有对应分值表或者直接按名次给分具体规则看报告里的说明。代码层面通常是先累加再对结果集排序// 累加各单项得分 int total 0; for (int score : itemScores) { total score; } athlete.setTotalScore(total); // 按总分降序排序对应热搜里的 java 排序 ListAthlete list athleteDao.getAll(); list.sort((a1, a2) - a2.getTotalScore() - a1.getTotalScore());逻辑说明先算总分再排序排序用 Comparator 或 Comparable 都行。这里用减法比较在分数范围小的时候没问题但如果分数可能溢出 int要改成 Integer.compare。排序后的列表再刷新到 Swing 的 JTable 上。注意录入成绩时要先校验该运动员该单项是否已录入避免重复累加这是实际跑的时候容易出的错。3.4 团体金牌统计的查询思路统计各团体金牌数量本质是一个分组聚合查询SELECT t.name, COUNT(*) AS gold_count FROM result r JOIN athlete a ON r.athlete_id a.id JOIN team t ON a.team_id t.id WHERE r.rank 1 GROUP BY t.name ORDER BY gold_count DESC;这段 SQL 把成绩表、运动员表、团体表关联起来筛出名次为 1 的记录按团体分组计数。rank 是关键字不同 MySQL 版本对关键字作列名的容忍度不同如果报语法错误给 rank 加反引号。查询结果映射到界面表格即可。这个查询也体现了 mysql 事务处理之外的另一面——多表关联和聚合课设报告里通常会把这条 SQL 作为重点写进去。4. 避坑与排查那些让课设卡半天的常见问题4.1 启动报 ClassNotFoundException: com.mysql.jdbc.Driver现象点运行直接抛异常提示找不到驱动类。原因驱动 jar 没加到项目依赖或者 jar 版本是 8.x 但代码里写的是旧类名。解决先确认 lib 下的 jar 已 Add as Library再核对类名8.x 用 com.mysql.cj.jdbc.Driver5.x 用 com.mysql.jdbc.Driver两者不能混。4.2 中文显示成问号或乱码现象界面里运动员姓名、团体名显示为 ???。原因数据库、表、连接串三处字符集不一致。解决建库时用 utf8mb4连接串加 useUnicodetruecharacterEncodingutf8Swing 组件如果还有问题检查源码文件本身的编码是不是 UTF-8IDEA 里 File Encoding 要统一设成 UTF-8。4.3 连接 MySQL 8.0 报时区或 SSL 错误现象启动时提示 The server time zone value 或 SSL 相关异常。原因8.0 驱动默认要求 serverTimezone 且默认开启 SSL。解决连接串补上 serverTimezoneAsia/Shanghai 和 useSSLfalse。这两个参数在 5.7 上加了也不影响属于兼容写法。4.4 查询无结果但界面没提示现象输入关键词点查询表格空白用户以为程序卡死。原因查询逻辑只刷新了表格没判断结果集是否为空。解决在查询后加判断如果 list 为空用 JOptionPane 弹出「未查询到匹配记录」。这是需求里明确要求的别漏。4.5 全能赛成绩重复录入导致总分虚高现象同一运动员同一单项录两次总分翻倍。原因录入前没查重。解决插入成绩前先按运动员 ID 和项目 ID 查一次存在就提示已录入或者改成更新而不是新增。这个坑在演示时特别容易被老师抓到。5. 从能跑到能交报告复用、功能扩展与验证习惯课设报告 docx 是这个资源里容易被低估的部分。它不只是凑字数用的里面通常有需求分析、E-R 图、表结构说明和核心 SQL这些正好对应你代码里的实体类和 DAO。我的习惯是先把报告里的 E-R 图对着 sports_meet.sql 核一遍确认字段名、类型、主外键一致再去看代码这样排查问题时心里有张地图。如果你要扩展功能比如加上需求里没做的修改和删除最省事的路径是在原有 DAO 里加 update 和 delete 方法界面加两个按钮复用已有的校验逻辑。删除要考虑外键约束先删成绩再删运动员否则会报约束冲突。验证一个课设是否真的跑通别只看登录成功。我一般会走一遍完整链路新增一个团体新增两名运动员挂到该团体新增一场比赛录入成绩查团体金牌统计再按姓名模糊查一次运动员。这一圈走下来录入校验、模糊查询、聚合统计、总分排序全都被覆盖到。如果哪一步弹窗提示不对或者数据没进库问题基本就锁定在那个模块。还有个小技巧把 MySQL 的 general_log 打开看程序实际发了哪些 SQL比在代码里打断点快。从那以后我每次拿到这种带 sql 脚本的课设包都强制先建库导数据、再改连接串、最后跑主类三步顺序不乱。希望帮到你。本文还有配套的精品资源点击获取