Java Swing学生选课系统全流程:环境配置、数据库导入与避坑指南 简介这是一份由Java Swing与MySQL实现的学生选课系统项目源码面向Java初学者、课程设计者及需要快速搭建桌面端管理系统的开发者。资源内含完整源码、数据库脚本、项目文档与运行演示视频覆盖登录验证、课程管理、选课操作、成绩查看等核心功能适合作为毕业设计或实训项目的参考模板。压缩包共168个文件主要包括Java源码与class编译文件、窗体设计文件、PNG/JPG界面图片、SQL数据库脚本、Word文档及操作录屏等整体大小约58.87MB结构清晰便于按模块查阅。该资源已有861人学习说明其实用性受到一定认可。通过本包可获取可直接导入Eclipse或MyEclipse运行的工程结合配套视频与文档快速完成环境配置、数据库导入及功能演示帮助理解Swing界面编程与MySQL数据交互的实际流程。1. Java swing学生选课系统一份能跑通「登录—选课—退选—管理」全流程的课设源码很多Java初学者第一次接触课设拿到的是一个只有编译后class文件的zip包看着后缀是.class就开始慌。这份Java swing MySQL实现的学生选课系统源码正是典型的课设形态压缩包里是编译好的class文件附带一个可导入的数据库脚本和演示视频目标是在eclipse或myeclipse里跑起来看到登录窗口、学生选课列表和管理员课程维护界面。它能解决的核心问题很直接——你不需要从零写Swing布局和JDBC连接只需要配置好环境、导入数据库、改对连接参数十分钟内把项目跑通然后在这个基础上改功能、写报告。适合的人群是正在做Java课程设计的学生、刚学完Swing和MySQL想找完整案例练手的人以及想快速了解桌面选课系统经典分层结构的从业者。注意这份资源的可运行性依赖JDK版本和MySQL驱动匹配后面几个章节会逐个拆清楚。2. 环境准备与项目导入eclipse报感叹号未必是代码问题2.1 JDK版本先定死Swing项目的命门在编译级别Swing是Java标准库的一部分从JDK 1.2到JDK 8一直稳定地躺在rt.jar里但JDK 9引入模块化后Swing被挪到了java.desktop模块。这意味着你在JDK 11、JDK 17的eclipse里直接新建项目跑Swing代码大概率会看到java.awt、javax.swing相关的编译错误——不是代码写错了是默认模块路径里没包含桌面模块。我的建议是直接用JDK 8跑这类课设项目理由有两个第一这份资源的class文件是拿JDK 8编译的可能性极高用更高版本运行时会遇到版本号不兼容第二JDK 8的javax.swing和java.sql都是开箱即用的不用配模块路径。先确认你机器上的默认JDKjava -version javac -version如果第一行输出里带1.8字样比如java version 1.8.0_281那环境没问题。如果是11.0或17.0要么装一个JDK 8并在eclipse里单独指定要么在项目的Build Path里把JRE System Library切到本机装的JDK 8。这里有个细节eclipse的Window Preferences Java Installed JREs里添加JDK 8的安装目录后右键项目 Build Path Configure Build Path Libraries把原来的JRE替换掉同时把Project Facets里的Java版本也改成1.8。改完以后如果项目还报红再看下一节。2.2 导入zip的完整操作不要解压后手动拖目录很多人拿到这个资源包第一反应是右键解压然后把解压出来的文件夹拖进eclipse的Package Explorer。这个操作不是不行但容易把.classpath和.project这两个eclipse项目描述文件弄丢或弄乱导致导入后项目结构残缺、启动时找不到主类。正确的做法是利用eclipse的归档导入功能让它直接读取zip包。菜单路径是File Import General Existing Projects into Workspace在Select archive file那一栏直接选中那份zip注意不能是嵌套zip也就是说resource压缩包内部如果是单层项目目录结构直接选最外层zip即可eclipse会自动解压到workspace并保留项目配置文件。导入后大概率会在项目图标上看到一个黄色感叹号这就是资源包描述里提到的需要配置基本信息。常见原因是Build Path里引用了不存在的jar包或者JRE版本对不上。打开Properties Java Build Path把带红叉的条目Remove掉再重新Add Library选JRE System Library感叹号通常就消了。这一步还有一个隐藏检查点项目里如果有lib目录里面应该放着MySQL驱动jar比如mysql-connector-java-5.1.38.jar。如果Build Path里没有引用这个jar运行时会报ClassNotFoundException: com.mysql.jdbc.Driver。你可以在Java Build Path Libraries Add JARs里把lib目录下的驱动加进去。确认没有红叉之后先别急着点运行数据库那一层还没配好。2.3 项目结构速览class文件命名的信息量把项目展开之后你会看到一类很典型的命名模式LogOnFrm.class是登录窗体MainFrm_admin.class是管理员主窗体CourseManageInterFrm.class是课程管理内部窗体StudentViewInterFrm.class是学生信息查看窗体SelectedViewInterFrm.class是已选课程查看窗体SelectCourseInterFrm.class是选课操作窗体PasswordModifyInterFrm.class是密码修改窗体。这套命名清晰地展示了这个系统的功能切分登录 管理员端课程管理 学生端选课查看 密码维护。注意一个容易被忽略的点这份zip里是以.class后缀出现的如果你在src目录下只看到class文件而看不到同名.java文件说明作者只交付了编译产物。这在课设资源里很常见不影响运行但会影响你读逻辑——你需要反编译工具把class还原成可读代码这一点在第5章会展开。现在先把数据库配好让项目先跑起来。3. 数据库与连接层navicat导入后先改这五个参数才连得上3.1 MySQL版本与驱动jar的匹配关系5.x和8.x不能混用这个项目是Java swing MySQL数据库连接用的是JDBC驱动。驱动jar的版本必须和你的MySQL服务端版本匹配否则会出现两种典型的翻车现场MySQL是5.7但用了8.x驱动会报Communications link failureMySQL是8.0但用了5.x驱动会报Public Key Retrieval is not allowed。先打开项目的lib目录看驱动文件名——如果里面是mysql-connector-java-5.1.x.jar那就老老实实配一个MySQL 5.7或5.6的服务端连接串里用com.mysql.jdbc.Driver如果你只能连8.0的MySQL需要把驱动换成mysql-connector-java-8.0.x.jar同时驱动类名改成com.mysql.cj.jdbc.Driver。我一般遇到课设包默认是5.1驱动但本机只装了MySQL 8的时候会直接换jar而不是降级数据库——换jar的成本远低于重装MySQL。驱动jar可以在maven中央仓库下载选8.0.29这类稳定版本替换后记得在eclipse里刷新lib目录并重新Add to Build Path。3.2 navicat导入数据库脚本字符集和root密码是第一道坎资源包里应该附带一个.sql文件这是建库建表的脚本。用navicat导入的完整路径是连接MySQL服务 → 右键localhost连接 → 新建数据库名字要和项目里连接串一致常见的库名是student_course或xuankele→ 选中这个库右键 →运行SQL文件→ 选择.sql文件 → 开始导入。导入前有两件事必须确认。第一sql文件的字符集。如果文件是UTF-8编码而navicat默认按GBK读取导入后所有中文字段名和注释会变成乱码更麻烦的是表里的中文数据比如课程名称、教师姓名也会乱。血泪经验先用记事本打开sql文件看前几行有没有SET NAMES utf8没有的话手动加上SET NAMES utf8mb4;作为第一行再导入。第二root账号的密码。项目里的连接串是写死的如果作者给的是root/123456而你的MySQL密码不是这个运行时会直接抛Access denied for user。你需要去改项目的数据库连接工具类通常叫DBUtil.java或ConnectionFactory.java把密码替换成你自己的。3.3 连接参数逐个拆解看懂DBUtil再看日志下面是一个至少包含完整参数的DBUtil代码这类课设项目的连接工具类基本长这样你拿到反编译代码后可以对照修改import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String DRIVER com.mysql.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/student_course?useUnicodetruecharacterEncodingutf8useSSLfalse; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }连接串里的参数逐个说清楚localhost:3306是MySQL默认地址端口如果你的服务跑在别的机器或端口改了这里要同步改student_course是数据库名要和navicat里建的库名完全一致注意大小写——Linux下的MySQL库名区分大小写后面的三个参数中useUnicodetrue和characterEncodingutf8负责中文不乱码useSSLfalse跳过SSL握手能减少连接时的握手延迟和部分连接失败问题。如果你的驱动是8.x连接串需要追加serverTimezoneAsia/Shanghai同时把DRIVER改成com.mysql.cj.jdbc.Driver不然后面连库时会报The server time zone value ???ú±ê׼ʱ¼ä is unrecognized。这段逻辑说明到位后改完密码和库名eclipse里运行LogOnFrm主窗口应该就能弹出来了。3.4 默认账号数据admin表里到底藏了什么数据库导入成功后navicat里刷新tables你会看到几张表学生表比如student、课程表course、选课表sc或selected_course、管理员表admin。登录窗体的账号校验本质就是拿你输入的账号密码去查对应表的username和password字段。资源包的文档或视频里通常会给出默认账号常见的组合是管理员admin/admin、学生账号stu001/123456。如果文档没写直接在navicat里查一下SELECT * FROM admin; SELECT * FROM student;拿到默认账号后先在navicat里手动登录验证数据库连接没问题再用这套账号去登录swing界面。这一步能帮你区分是数据库连不上还是账号密码不对——很多人运行时报错第一反应是代码问题其实先执行一条SQL就能定位问题边界。4. 登录到主窗体从LogOnFrm到MainFrm_admin的关键类拆解4.1 登录校验与SQL注入边界课设代码也要守住PreparedStatementLogOnFrm是系统的入口从类名能看出来这是一个JFrame的子类。这类课设项目的登录逻辑通常是读取两个文本框账号、密码拼SQL查询用户表结果集有记录就跳转到主窗体没有就弹错误提示。最原始的写法是字符串拼接SQL这就有SQL注入的风险。用反编译工具打开这个class后你应该重点看它是怎么查询的。一个合格的写法是下面的样子这也是很多课设项目在答辩时会被老师要求改的代码String sql SELECT * FROM admin WHERE username ? AND password ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { // 登录成功跳转到 MainFrm_admin } else { JOptionPane.showMessageDialog(this, 用户名或密码错误); }用PreparedStatement而不是Statement拼接字符串除了防注入之外还有一个实际的工程好处MySQL服务端可以对预编译语句做缓存连续多次登录时性能更好。如果你在反编译代码里看到的是Statement 字符串拼接建议重构成上面这样——这也是一份课设源码拿高分最容易的改动点。注意参数顺序要和SQL里的问号一一对应setString(1, username)填充的是第一个问号setString(2, password)是第二个参数类型不对时setObject也可以胜任。4.2 权限分流一套代码里管理员和学生怎么共用主窗体登录成功后跳到哪里是由账号类型决定的。这个项目的类名里有两个关键信息MainFrm_admin明确标注了管理员主窗体而学生端则可能通过同一个MainFrm以不同参数构造。课设里常见的做法是用户表里有一个role字段admin或student登录校验时拿到这个字段用if-else分支决定创建哪个窗体。功能对应关系可以这样梳理管理员登录后进MainFrm_admin通过菜单或按钮打开CourseManageInterFrm课程管理和CourseAddInterFrm课程新增学生登录后进StudentViewInterFrm个人信息、SelectCourseInterFrm选课、SelectedViewInterFrm已选课程和PasswordModifyInterFrm改密码。这种把每个业务功能封装成独立内部窗体的模式是swing项目的经典套路——主窗体只做导航业务窗体各自持有数据库连接并在init()方法里加载数据。如果你要在这个资源基础上扩展功能比如增加一个教师端就照着这个模式新建一个TeacherMainFrm和对应的InterFrm在登录分支里加一个else if判断角色然后再建表——整个项目的扩展成本是线性增长的。4.3 Swing窗体间跳转逻辑dispose和setVisible的先后顺序窗体跳转是swing新手的重灾区也是这份源码里值得拆的细节。登录窗跳主窗的标准套路是先实例化目标窗体对象调用setVisible(true)显示主窗体再调用dispose()销毁登录窗口。注意顺序——如果先dispose当前窗体再实例化目标窗体当前线程的EventQueue有可能在目标窗体完全初始化前把事件循环切走界面会闪一下黑屏或者方向的组件没渲染完。MainFrm_admin mainFrm new MainFrm_admin(rs.getString(username)); mainFrm.setVisible(true); this.dispose();反编译时看到这段代码就说明作者顺序是对的。这里rs.getString(username)把当前登录用户名传给主窗体主窗体在JLabel上显示欢迎 xxx或者用它做后续操作人记录。setVisible(true)之前如果窗体内容比较多还应该先调用mainFrm.init()或类似方法加载课程数据再做显示否则用户会先看到一个空白窗体过一两秒数据才刷出来——这是swing单线程模型下典型的卡顿观感问题。如果窗体跳转后按钮没反应优先检查按钮的监听器是否在init()里被正确添加很多课设代码把addActionListener和init()的执行顺序搞反了。4.4 四个内部窗体的职责边界在哪里读表在哪里写表把四个InterFrm放在一起看CourseManageInterFrm和CourseAddInterFrm是写操作端负责新增、修改、删除课程SelectCourseInterFrm是学生选课操作端写选课表SelectedViewInterFrm是读操作端查已选课程列表PasswordModifyInterFrm是更新操作端只动student表里的密码字段。课设项目喜欢把所有SQL直接写在窗体类里这既是缺点也是优点——缺点是无法复用、耦合度高优点是新手读代码时不用到处跳转打开一个类就能看到完整的业务逻辑。实操上如果你要修改选课逻辑只需打开SelectCourseInterFrm找到执行INSERT INTO sc(student_id, course_id) VALUES(?, ?)的地方改SQL即可。注意选课表和课程表的关联查询SelectedViewInterFrm里通常是一个带JOIN的SQL用来把选课表里的课程ID转成课程名称、学分、教师等展示信息。这种边界清晰的拆分方式是swing课设项目的通用写法掌握之后无论拿到什么课设包都能快速定位逻辑位置。5. 五个常见排查坑Class文件能跑不代表代码能看懂5.1 坑一src目录下全是.class双击打开是乱码现象eclipse里展开src目录看到的全是带绿色圆圈的class文件双击打开是二进制或者反编译后的乱码找不到任何.java源文件。原因压缩包里只打包了编译产物源码文件被作者留在了本地。这是课设资源包的常见形态不是项目坏了。解决用反编译工具把class还原成可读代码。我一般用JD-GUI直接打开jar或class文件所在文件夹立刻能看到还原度很高的源码。如果整个项目是一堆分散的class可以用jar cf xxx.jar *.class先打包再拖进JD-GUI批量查看。还原出来的代码虽然方法体和逻辑都在但局部变量名可能变成a、b、str之类不影响理解。5.2 坑二运行报ClassNotFoundException: com.mysql.jdbc.Driver现象点运行后控制台有异常提示找不到MySQL驱动类。原因项目lib目录下的驱动jar没有被添加到Build Path或者lib目录里根本没有jar。解决确认lib目录存在且jar文件在然后右键项目 Build Path Add JARs选中jar。如果lib目录里确实没有驱动去maven中央仓库下载注意版本匹配——详情见第3章的驱动匹配说明。补充一个隐藏场景eclipse里Add JARs和Add External JARs是有区别的前者会把jar路径写进.classpath并随项目移动后者写的是你本机的绝对路径换电脑后项目走不走得了取决于jar是否还在原路径。课设打包时lib目录是好习惯。5.3 坑三数据库连接报Communications link failure现象程序启动但登录时卡几秒然后弹窗提示通信链路失败。原因这串报错是个烟雾弹真正的错误原因在下面几行——最常见的是MySQL服务没启动、端口被改、root密码不对或者驱动和服务端版本不匹配5.1驱动连MySQL 8就会这样。解决先在navicat里测试连接navicat能连上基本说明服务、端口、账号密码都是好的问题只剩驱动版本和连接串navicat也连不上的话先看Windows服务里MySQL服务是否已启动再确认端口。注意MySQL 8默认端口还是3306但如果你本机装了多个MySQL实例第二个实例可能占了3307。5.4 坑四登录成功但界面中文全部变成问号现象登录窗体正常弹出但按钮文字、表格列名、课程名称全是?????。原因三处字符集不一致——sql文件导入时用了latin1、连接串没指定characterEncodingutf8、JVM默认编码不是UTF-8。解决按顺序排查。先在navicat里看表中的中文数据是否正常不正常就重新导入sql文件并在文件头部加SET NAMES utf8mb4;数据正常但程序显示乱码那就是连接串缺了useUnicodetruecharacterEncodingutf8补上重启。还有最后一层可能性项目源文件本身是GBK编码eclipse默认UTF-8读字符串字面量里的中文就会乱。右键项目 Properties Resource把Text file encoding改成GBK或UTF-8试一次看看哪个编解码能对上。这三个位置都检查完乱码问题基本就绝迹了。5.5 坑五主窗体出现但选课列表是空的且无任何报错现象学生登录后选课窗口能打开表格里没数据控制台也没有异常。原因查询SQL关联了错误的表名或字段名比如选了sc表但实际建表时叫choose_record或者课程表里确实没有数据。解决先在navicat里执行SELECT * FROM course;和SELECT * FROM sc;看结果确认表里有数据。有数据而程序查不到就是SQL的表名/字段名不一致找到SelectCourseInterFrm里组装SQL的地方把表名改成数据库里的真实表名。这种无报错但数据为空的坑在JTable渲染场景里最容易让人误判其实问题根本不在界面层。6. 进阶验证与迁移反编译对照源码以及Swing版怎么走向Web版拿到这份资源后有一个值得做的进阶验证动作用反编译工具还原源码对照视频里演示的功能逐个确认类与功能的对应关系。做法是这样的——用JD-GUI打开LogOnFrm.class找到登录成功后的分支语句确认它跳转的窗体类和数据库查询的用户表字段再打开SelectedViewInterFrm.class看它的SQL是否用了JOIN查询。这套对照验证能帮你判断这份资源是否完整、作者是否删改了关键逻辑。完整跑通的标志是管理员能新增课程学生能看到新增的课程并成功选课选课后SelectedViewInterFrm能查到记录密码修改后能用新密码登录。四步全部走通这份资源对你来说就是可用的。接着是迁移思路。摘要里提到后续会出Java web版从桌面端迁到web端核心逻辑并不需要重写——那几张表admin、student、course、sc直接原样导入MySQLDAO层的SQL语句原样复用LogOnFrm里的登录校验逻辑原样照搬到Servlet的doPost或Spring Boot的Controller里JTable换成前端表格JOptionPane换成前端弹窗。这就是swing课设项目迁移到web的通用套路。这张表可以从我自己的项目经历验证我拿一份swing图书管理系统的SQL只改了表名和字段就复用到Spring BootVue的毕设里数据库设计层面的东西是通用的变的只有展示层代码。最后的验证技巧是加一条日志控制在DBUtil的getConnection()里打印连接是否成功在登录SQL执行后打印结果集行数。这样你改动任何配置后日志能直接告诉你卡在哪一层——数据库连接层、SQL执行层、还是界面渲染层。我从那次以后每次拿到课设包都强制先做两件事第一打开lib目录看驱动jar的版本先决定MySQL用5还是8第二在navicat里把数据库脚本导进去验证表结构和数据完整性。这两步走完再碰eclipse翻车率能降一大半。希望帮到你。本文还有配套的精品资源点击获取