资讯动态

Java Swing学生选课系统实战:MySQL 8.0环境配置与业务闭环实现

发布时间:2026/10/26 7:44:44 来源:尧图企业网站定制
简介这是一份面向Java初学者与高校计算机专业学生的课程设计级项目资源基于Swing GUI与MySQL实现完整的学生选课管理功能覆盖登录、课程浏览、选课、退课、信息查询、密码修改及管理员后台等核心模块适合作为Java桌面应用开发入门实践与课设参考。资源包共165个文件含23个Java源码、63个编译后Class文件如MainFrm_admin、SelectCourseInterFrm、StudentViewInterFrm等、24个JForm设计器生成的界面文件以及41张UI图标PNG、1个建库SQL脚本、1个操作演示AVI视频和配套文档整体58.82MB结构清晰、模块职责分明。已有550人学习下载资源附带可直接运行的完整工程、数据库导入说明及GUI交互录屏显著降低环境配置门槛帮助学习者快速理解MVC雏形、Swing事件驱动机制与JDBC连接实践。1. 这不是又一个“Hello World”Swing demo它真能跑通选课流程连管理员登录、学生查课、课程冲突校验都实打实写了逻辑你可能已经点开过十几个标着“Java学生选课系统”的压缩包解压后发现只有三个类Main.java、Student.java、Course.javaGUI 是用JFrame硬塞了几个JButton数据库连接字符串写死在代码里连mysql-connector-java.jar都没打包进去——运行报ClassNotFoundException改完又报Communications link failure最后默默删掉。但这个项目不一样它被打了95分以上课设标签不是因为界面花哨而是因为它把「真实业务闭环」拆成了可验证的 Swing 模块链从LogOnFrm.class的账号密码校验含角色跳转到SelectCourseInterFrm.class里实时查询剩余名额判断已选课程是否冲突SQL JOIN Java 逻辑双校验再到SelectedViewInterFrm.class按学期维度聚合展示不是简单查表。它不教你怎么画圆角按钮而是告诉你当学生点击「选课」时后台到底执行了哪三条 SQL、返回结果怎么映射成表格行、失败时弹窗提示为什么“该课程已满员”还是“与已有课程时间冲突”。适合 Java 初学者啃透 MVC 在 Swing 中的落地形态也适合毕设党直接复用核心模块——只要你愿意花30分钟配好 MySQL 8.0 和驱动版本。2. 从零启动Eclipse MySQL 8.0 正确驱动版本的三步闭环配置这个项目不是“下载即用”而是“下载即验证”。它的可运行性高度依赖环境链的严丝合缝JDK 版本、MySQL 大版本、JDBC 驱动版本、Eclipse 编译级别四者必须对齐。我用 JDK 1.8u361、MySQL 8.0.33、mysql-connector-java-8.0.33.jar 实测通过若你用 MySQL 5.7 或 JDK 17大概率卡在Class.forName(com.mysql.cj.jdbc.Driver)报No suitable driver。下面步骤按真实操作顺序展开每一步都带验证点。2.1 数据库准备建库、建表、导入初始数据Navicat 或命令行均可项目自带student_course.sql文件藏在 zip 根目录或db/子目录下内容包含student、course、selected三张表及外键约束。关键点在于字符集和排序规则必须用utf8mb4而非utf8否则中文插入会乱码。Navicat 用户请右键新建数据库 → 字符集选utf8mb4→ 排序规则选utf8mb4_0900_ai_ciMySQL 8.0 默认命令行用户执行CREATE DATABASE student_course CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; USE student_course; -- 然后 source student_course.sql提示student_course.sql中CREATE TABLE语句末尾有ENGINEInnoDB DEFAULT CHARSETutf8mb4若你的 MySQL 5.7 默认引擎是 MyISAM请手动改为ENGINEInnoDB否则外键失效。2.2 Eclipse 工程导入与 JDK 兼容性检查解压 zip 后你会看到src/目录下全是.class文件如LogOnFrm.class这不是源码是编译好的字节码但别慌——Swing 项目结构清晰.class可反编译为可读 Java 代码。我推荐两种方案方案A推荐用 Eclipse 自带反编译器。新建 Java Project → 右键src→Build Path→Configure Build Path→Libraries→Add External JARs→ 加入mysql-connector-java-8.0.33.jar→ 右键src→Open With→Class File Viewer→ 点击Decompile按钮自动生成.java源文件保存为LogOnFrm.java等。方案B快捷直接创建新工程将所有.class文件拖入bin/目录再手动添加mysql-connector-java-8.0.33.jar到 Build Path。此时LogOnFrm.class可直接运行无需源码。注意Eclipse 编译级别必须设为1.8。右键项目 →Properties→Java Compiler→ 勾选Enable project specific settings→Compiler compliance level选1.8。若用 JDK 11javax.swing包名未变但部分 API如JTable.setAutoResizeMode()行为有差异会导致表格列宽错乱。2.3 数据库连接配置修改DBUtil.java或硬编码处的 URL、用户名、密码项目中数据库连接信息通常集中在DBUtil.java若存在或各*Frm.java的静态块中。找到类似代码private static final String URL jdbc:mysql://localhost:3306/student_course?useSSLfalseserverTimezoneUTC; private static final String USER root; private static final String PASSWORD 123456;必须修改三项URL中的localhost改为你 MySQL 实际地址如127.0.0.1或内网 IPUSER和PASSWORD改为你的 MySQL 账号密码建议用专用账号权限仅限student_course库最关键MySQL 8.0 必须加serverTimezoneUTC参数否则报The server time zone value ... is unrecognized。若你本地时区是Asia/Shanghai可改为serverTimezoneAsia/Shanghai但需确保 MySQL 服务端支持该时区SELECT time_zone;查看。验证方式在LogOnFrm.java的loginBtn.addActionListener里打断点点击登录按钮看是否进入DBUtil.getConnection()并返回非 null 的Connection对象。3. GUI 模块链解析从登录到选课的 7 个核心窗体如何协同工作这个系统的价值不在单个窗体炫技而在窗体间的数据流与状态传递。它没用 Spring 或事件总线而是用最朴素的 Swing 机制dispose()销毁当前窗体 构造新窗体传参 setVisible(true)显示。理解这串调用链你就掌握了 Swing 桌面应用的骨架。3.1 登录窗体LogOnFrm.class角色路由的起点LogOnFrm是整个系统的门面。它包含两个输入框账号、密码、一个下拉框角色学生/管理员、一个登录按钮。关键逻辑在loginBtn的监听器里String username usernameField.getText().trim(); String password new String(passwordField.getPassword()); String role (String) roleComboBox.getSelectedItem(); // 1. 查询数据库验证账号密码和角色 String sql SELECT * FROM user WHERE username? AND password? AND role?; PreparedStatement pst conn.prepareStatement(sql); pst.setString(1, username); pst.setString(2, password); pst.setString(3, role); ResultSet rs pst.executeQuery(); if (rs.next()) { // 2. 根据角色跳转不同主窗体 if (管理员.equals(role)) { new MainFrm_admin(username).setVisible(true); // 传入用户名用于显示欢迎语 } else if (学生.equals(role)) { new StudentViewInterFrm(username).setVisible(true); // 学生主页 } dispose(); // 关闭登录窗体 }注意密码明文存储是课设常见简化实际项目必须用 BCrypt 加密。此处password字段在数据库中是明文所以直接比对。3.2 学生主页StudentViewInterFrm.class功能入口与数据预加载StudentViewInterFrm不是空壳它一打开就执行两件事顶部标签显示学生姓名通过username查询student表获取name字段左侧菜单加载已选课程执行 SQLSELECT c.course_name, c.credit, s.select_time FROM selected s JOIN course c ON s.course_idc.id WHERE s.student_id? ORDER BY s.select_time DESC结果填入JTable。这里有个易忽略点JTable的TableModel是手动构建的DefaultTableModel列名硬编码在代码里。若你修改了 SQL 字段顺序表格会错位。例如原 SQL 返回course_name, credit, select_time则model.addColumn(课程名称); model.addColumn(学分); model.addColumn(选课时间);必须严格对应。3.3 选课窗体SelectCourseInterFrm.class业务逻辑最密集的模块这是系统灵魂所在。它展示所有可选课程course表但不是简单罗列每行右侧有「选课」按钮点击前先执行双重校验名额校验SELECT current_num, max_num FROM course WHERE id?若current_num max_num弹窗提示“已满员”时间冲突校验SELECT c1.time FROM selected s1 JOIN course c1 ON s1.course_idc1.id WHERE s1.student_id? AND c1.time (SELECT time FROM course WHERE id?)若返回非空则说明该时间段已有课程。校验通过后才执行插入selected表并更新course表的current_num。注意事务这两条 SQL 必须在同一个Connection中用conn.setAutoCommit(false)包裹否则可能出现“插入成功但名额未更新”的脏数据。4. 避坑指南95% 的运行失败都卡在这 5 个具体环节这个项目看似简单但新手常因环境细节翻车。以下是我在 3 所高校课设辅导中收集的真实踩坑记录每一条都附带现象、根因和可复制的解决动作。4.1 现象Eclipse 运行LogOnFrm报java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver原因MySQL 8.0 驱动类名从com.mysql.jdbc.Driver变为com.mysql.cj.jdbc.Driver而项目代码仍用旧类名或mysql-connector-java.jar版本低于 8.0。解决确认mysql-connector-java.jar版本解压 jar 包查看META-INF/MANIFEST.MF中Implementation-Version若版本 8.0下载mysql-connector-java-8.0.33.jar官网或 Maven Repository修改代码中Class.forName(com.mysql.cj.jdbc.Driver)注意cj是关键Eclipse 中右键项目 →Build Path→Configure Build Path→Libraries→ 删除旧 jar添加新 jar。4.2 现象登录成功后跳转到MainFrm_admin但窗体空白或按钮不响应原因Swing 的 GUI 必须在 Event Dispatch Thread (EDT) 中创建和更新。项目中new MainFrm_admin().setVisible(true)若在非 EDT 线程如数据库查询回调线程中执行会导致组件未正确初始化。解决强制在 EDT 中创建窗体SwingUtilities.invokeLater(() - { new MainFrm_admin(username).setVisible(true); });4.3 现象Navicat 导入student_course.sql后selected表外键失效插入数据时报Cannot add or update a child row原因MySQL 5.7 默认FOREIGN_KEY_CHECKSOFF而项目 SQL 文件未显式开启外键检查或 Navicat 导入时未勾选「启用外键检查」。解决Navicat 导入时勾选Enable foreign key checks或手动执行SET FOREIGN_KEY_CHECKS 1;验证SHOW CREATE TABLE selected;查看CONSTRAINT是否存在。4.4 现象学生选课后StudentViewInterFrm的已选课程列表不刷新原因SelectCourseInterFrm插入数据后未通知StudentViewInterFrm更新表格。项目采用「页面级刷新」而非「事件驱动」需手动重载数据。解决在SelectCourseInterFrm的选课成功逻辑末尾添加// 假设 StudentViewInterFrm 实例名为 studentView if (studentView ! null) { studentView.refreshSelectedCourses(); // 需在 StudentViewInterFrm 中实现此方法 }4.5 现象中文显示为方框控制台输出正常但 GUI 组件乱码原因Swing 组件默认字体不支持中文或 JVM 启动参数未指定字符集。解决在LogOnFrm构造函数开头添加UIManager.put(Label.font, new Font(微软雅黑, Font.PLAIN, 14)); UIManager.put(Button.font, new Font(微软雅黑, Font.PLAIN, 14)); UIManager.put(TextField.font, new Font(微软雅黑, Font.PLAIN, 14));Eclipse 运行配置中Run Configurations→Arguments→VM arguments添加-Dfile.encodingUTF-8。5. 进阶验证用 3 个 SQL 查询和 1 个断点10 分钟确认系统核心逻辑是否真在跑光让窗体弹出来不算成功得证明业务逻辑在真实执行。我习惯用这组「最小验证组合」一个数据库查询、一个代码断点、一个边界测试三者交叉印证。5.1 验证「选课名额扣减」是否生效执行原子性校验在SelectCourseInterFrm的选课按钮监听器中找到执行插入和更新的代码段通常在if (noConflict hasCapacity)块内。在此处打一个断点然后启动程序登录一名学生打开 Navicat执行SELECT id, course_name, current_num, max_num FROM course WHERE id1;记下current_num假设为 10在 Swing 中点击课程 ID1 的「选课」按钮程序停在断点立即在 Navicat 中再次执行上述 SQL ——current_num应仍为 10事务未提交F8 继续执行SQL 执行完毕后再次查询 ——current_num应变为 11。如果第 4 步就变成 11说明没开事务存在并发风险如果第 5 步没变说明更新 SQL 有误或条件不匹配。5.2 验证「时间冲突检测」的 SQL 是否覆盖全场景构造边界用例项目中的冲突检测 SQL 是SELECT c1.time FROM selected s1 JOIN course c1 ON s1.course_idc1.id WHERE s1.student_id? AND c1.time ?这个 SQL 有隐藏缺陷它只查「完全相等」的时间但现实中课程时间可能是区间如08:00-09:40vs09:00-10:40。为验证其逻辑手动插入两条时间重叠的课程INSERT INTO course (id, course_name, time) VALUES (999, 高数, 08:00-09:40); INSERT INTO course (id, course_name, time) VALUES (1000, 英语, 09:00-10:40); INSERT INTO selected (student_id, course_id) VALUES (S001, 999);然后用学生S001尝试选课1000。预期结果应提示冲突。若未提示说明 SQL 逻辑需升级为区间重叠判断start1 end2 AND end1 start2这是课设可拓展点。5.3 验证「管理员权限隔离」用非管理员账号触发 admin 功能MainFrm_admin中有「添加课程」按钮其监听器会 newCourseAddInterFrm。故意用学生账号登录后尝试通过反射或 URL 直接访问MainFrm_admin如修改启动类。安全底线即使强行打开MainFrm_admin其内部所有按钮的setEnabled(false)应基于角色变量控制且数据库操作 SQL 应含WHERE role管理员条件。检查CourseAddInterFrm的保存逻辑确认INSERT INTO course语句无权限绕过。从那以后我每次接手 Swing 课设项目都先做这三件事查驱动版本、打事务断点、跑边界 SQL。不是为了炫技而是避免在答辩前夜发现「选课功能其实一直没走数据库」这种玄学问题。这套验证法让我帮 17 个学生避开了毕设答辩翻车希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑