简介:这是一份由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都是开箱即用的,不用配模块路径。先确认你机器上的默认JDK:
java -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 failure;MySQL是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?useUnicode=true&characterEncoding=utf8&useSSL=false"; 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库名区分大小写;后面的三个参数中,useUnicode=true和characterEncoding=utf8负责中文不乱码,useSSL=false跳过SSL握手,能减少连接时的握手延迟和部分连接失败问题。如果你的驱动是8.x,连接串需要追加serverTimezone=Asia/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注入边界:课设代码也要守住PreparedStatement
LogOnFrm是系统的入口,从类名能看出来这是一个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、连接串没指定characterEncoding=utf8、JVM默认编码不是UTF-8。解决:按顺序排查。先在navicat里看表中的中文数据是否正常,不正常就重新导入sql文件并在文件头部加SET NAMES utf8mb4;;数据正常但程序显示乱码,那就是连接串缺了useUnicode=true&characterEncoding=utf8,补上重启。还有最后一层可能性:项目源文件本身是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)直接原样导入MySQL,DAO层的SQL语句原样复用,LogOnFrm里的登录校验逻辑原样照搬到Servlet的doPost或Spring Boot的Controller里,JTable换成前端表格,JOptionPane换成前端弹窗。这就是swing课设项目迁移到web的通用套路。这张表可以从我自己的项目经历验证:我拿一份swing图书管理系统的SQL,只改了表名和字段就复用到Spring Boot+Vue的毕设里,数据库设计层面的东西是通用的,变的只有展示层代码。
最后的验证技巧是加一条日志控制:在DBUtil的getConnection()里打印连接是否成功,在登录SQL执行后打印结果集行数。这样你改动任何配置后,日志能直接告诉你卡在哪一层——数据库连接层、SQL执行层、还是界面渲染层。
我从那次以后,每次拿到课设包都强制先做两件事:第一,打开lib目录看驱动jar的版本,先决定MySQL用5还是8;第二,在navicat里把数据库脚本导进去,验证表结构和数据完整性。这两步走完再碰eclipse,翻车率能降一大半。希望帮到你。
本文还有配套的精品资源,点击获取