
简介这是一套面向Java初学者与课程设计学习者的学生成绩管理系统完整源码基于Java语言开发搭配MySQL数据库适合用于课程设计参考、毕业设计练手或Java GUI与JDBC实战学习。压缩包共104个文件约714KB包含68个class编译文件、29个java源码、2个jar依赖包及project、classpath等工程配置另附1份docx说明文档源码与可运行文件齐全便于直接导入IDE研究。系统功能覆盖学生信息管理、成绩录入与查询、成绩统计分析、选课管理及用户权限区分涉及Swing/JavaFX界面设计与JDBC数据库交互等核心知识点。目前已有600人学习下载读者可借此理解Java桌面应用的分层结构、数据库连接与增删查改实现并参考其代码组织方式提升软件工程实践能力。1. 从一份 Java 学生成绩管理系统压缩包说起它到底能跑通什么如果你手头正躺着一个Java学生成绩管理系统.rar双击解压后看到一堆.java、.sql、.jar和配置文件却不确定它能不能直接跑、数据库怎么接、登录账号在哪改那这篇就是写给你的。这类资源在课程设计、实训交付、二次开发起步阶段出现频率极高核心价值不在于代码多优雅而在于它把「学生信息维护 课程成绩录入 查询统计 权限区分」这条完整链路用 Java MySQL 串了起来能让你在一个下午内看到可交互的界面和真实落库的数据。适合谁适合需要快速搭出可演示原型的学生、需要给非技术同事展示流程的产品岗、以及想拿一个现成 CRUD 骨架改造成自己业务模块的初中级开发者。它不解决高并发也不负责漂亮 UI但作为「能跑起来的第一版」它省掉的是你从零建表、写 JDBC 工具类、调 Swing 布局的那两三天。2. 拆包先看结构Java 源码、SQL 脚本与依赖怎么对上号拿到压缩包别急着导入 IDE先按文件类型分堆。常见做法是根目录下会有src或直接散落的包目录、lib、sql、config这几类。你要做的第一件事是确认「入口类在哪、建表脚本在哪、数据库连接参数写在哪」。这三样对不上后面全是白忙。2.1 识别入口类与包结构解压后优先找带main方法的类通常叫Main、LoginFrame、App或Start。用编辑器全局搜public static void main命中的文件就是启动点。如果项目是 Swing 桌面应用入口往往先拉起登录窗口如果是控制台版入口会直接打印菜单。包名一般是com.xxx.student这种形式别改包名改了要同步改import和配置文件里的类路径。# 在解压目录下快速定位入口类和 SQL 脚本 find . -name *.java | xargs grep -l public static void main find . -name *.sql find . -name *.properties -o -name *.xml -o -name *.ini逻辑说明第一条命令找出所有含main方法的 Java 文件缩小启动范围第二条定位建表脚本第三条找出可能存放数据库账号密码的配置文件。参数上没什么可调的注意 Windows 下如果用find报错换 Git Bash 或 WSL 执行。2.2 数据库脚本与连接配置的对应关系打开sql目录下的脚本先看它建了几个库、几张表。典型结构是student表存学号姓名班级course表存课程名和学分score表存学号、课程号、分数外加一张user表做登录。脚本开头一般有CREATE DATABASE和USE语句记住库名后面改配置要用。连接配置常见三种形态.properties文件、硬编码在DBUtil.java里、或者写在 XML 里。搜jdbc:mysql这个关键字命中的地方就是你要改的。# 典型 db.properties按你本机实际情况改 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/student_score?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 jdbc.usernameroot jdbc.password你的密码逻辑说明jdbc.url里的student_score必须和 SQL 脚本里CREATE DATABASE的库名一致serverTimezone不写在高版本 MySQL 驱动下会报时区错误characterEncodingutf8防止中文姓名乱码。参数怎么改端口默认 3306如果你本机 MySQL 改过端口就同步改用户名密码填你本地能登录的那个不要照抄别人的。提示如果配置是硬编码在 Java 文件里改完记得重新编译别只改源码不重新构建。2.3 依赖 jar 包与 JDK 版本匹配lib目录里通常有mysql-connector-java-x.x.x.jar可能还有jcalendar、rs2xml这类辅助包。先确认你的 JDK 版本JDK 8 用mysql-connector-java-5.1.x或8.0.x都能跑JDK 11 以上建议用8.0.x驱动。如果导入 IDE 后满屏红九成是 jar 没加到构建路径而不是代码本身有问题。# 查看当前 JDK 版本 java -version javac -version逻辑说明两条命令分别看运行时和编译器版本两者最好一致。如果java -version是 1.8 而javac是 17说明环境变量混了先统一再谈跑项目。3. 把系统跑起来建库、导数据、改配置、启动四步走这一章是真正动手的部分。我一般按「先库后码」的顺序来数据库没通界面再漂亮也是空壳。下面四步走完你大概率能看到登录窗口。3.1 建库与导入 SQL 脚本用命令行或图形工具都行命令行更可控。先登录 MySQL再执行脚本。# 登录 MySQL密码回车后输入 mysql -u root -p # 在 MySQL 交互界面里执行脚本 source /你的路径/sql/student_score.sql;逻辑说明source后面跟脚本绝对路径Windows 下路径用正斜杠或双反斜杠。执行完用SHOW DATABASES;确认库已创建再USE 库名;后SHOW TABLES;看表是否齐全。如果脚本里没有CREATE DATABASE只有CREATE TABLE你需要先手动建库再执行。常见翻车点脚本编码是 GBK而你的客户端默认 UTF8导入后中文变问号。解决办法是用mysql --default-character-setgbk -u root -p登录后再 source。3.2 修改数据库连接参数并验证连通配置改完后别急着启动整个系统先写一个最小连通测试。很多「启动就报错」其实是数据库根本没连上。// TestConn.java单独跑一次确认驱动和账号没问题 import java.sql.Connection; import java.sql.DriverManager; public class TestConn { public static void main(String[] args) throws Exception { Class.forName(com.mysql.cj.jdbc.Driver); String url jdbc:mysql://localhost:3306/student_score?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; Connection conn DriverManager.getConnection(url, root, 你的密码); System.out.println(连接成功 conn); conn.close(); } }逻辑说明Class.forName加载驱动高版本驱动不写也能连但建议保留getConnection三个参数分别是 URL、用户名、密码。如果报Access denied是账号密码错报Unknown database是库名不对或没建库报Communications link failure是 MySQL 服务没启动或端口不对。参数上useSSLfalse在本地开发可以关掉省去证书麻烦。3.3 在 IDE 中导入项目并补齐依赖以常见 IDE 为例新建 Java 项目把src下的包整体拷进去再把lib里的 jar 通过「Add as Library」加进构建路径。如果项目根目录有.classpath或pom.xml优先用「Import Existing Project」或「Maven Import」让工具自己解析依赖比手动加快。# 如果你用 Maven 且项目没有 pom可以手动补一个最小 pom cat pom.xml EOF project xmlnshttp://maven.apache.org/POM/4.0.0 modelVersion4.0.0/modelVersion groupIdcom.demo/groupId artifactIdstudent-score/artifactId version1.0/version dependencies dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependencies /project EOF逻辑说明这个 pom 只声明了 MySQL 驱动够跑通数据库部分。版本号8.0.33是常见稳定版你本地已有其他 8.0.x 也可以换。加完 pom 后执行mvn dependency:resolve让依赖落盘再在 IDE 里刷新 Maven 项目。3.4 启动入口类与首次登录入口类右键 Run。如果是 Swing 登录窗默认账号密码通常写在 SQL 脚本的user表插入语句里常见是admin/123456或teacher/000000。登录后先别急着录成绩按「新增学生 → 新增课程 → 录入成绩 → 查询统计」走一遍确认每个环节都落库。-- 查看默认账号别去猜 SELECT * FROM user; -- 查看学生表结构确认字段名和界面是否对应 DESC student;逻辑说明SELECT * FROM user直接看有哪些账号和角色字段DESC student看字段类型和长度如果界面里学号输入框限制 10 位而数据库是varchar(20)说明有冗余空间改界面校验时心里有数。注意首次跑通后先备份一份原始压缩包和 SQL 脚本后面改崩了还能回退这是血泪经验。4. 成绩统计与权限控制核心逻辑改哪里、参数怎么调系统能跑只是及格线真正要拿去交作业或做二次开发你得知道统计逻辑和权限判断写在哪。这一章拆两个最常被改动的模块。4.1 成绩统计 SQL 的写法与常见口径统计功能一般落在ScoreDao或ScoreService里核心是几条聚合 SQL。常见口径有按课程算平均分、按学生算总分、按班级排名。改之前先确认业务要的是「平均分保留几位」「缺考算不算 0 分」。-- 按课程统计平均分、最高分、最低分 SELECT c.course_name, AVG(s.score) AS avg_score, MAX(s.score) AS max_score, MIN(s.score) AS min_score, COUNT(*) AS cnt FROM score s JOIN course c ON s.course_id c.course_id GROUP BY c.course_name; -- 按学生统计总分并排名 SELECT st.student_name, SUM(s.score) AS total, RANK() OVER (ORDER BY SUM(s.score) DESC) AS rk FROM score s JOIN student st ON s.student_id st.student_id GROUP BY st.student_name;逻辑说明第一条用JOIN把成绩和课程名关联GROUP BY按课程聚合第二条用窗口函数RANK()做排名MySQL 8.0 以上才支持5.7 需要用变量模拟。参数上AVG默认忽略 NULL如果缺考存的是 NULL 就不计入平均若业务要求缺考算 0得用IFNULL(s.score,0)包一层。改口径时只动 SQL别去改 Java 里的循环计算否则两处逻辑容易打架。4.2 登录与角色权限的判断链路权限通常分管理员、教师、学生三种角色判断点有两个登录时查user表的role字段进入主界面后根据角色隐藏或禁用某些按钮。改权限别只改界面服务端方法也要拦一道否则懂点技术的用户能绕过界面直接调。// 登录校验与角色分支的典型写法 public User login(String username, String password) { String sql SELECT * FROM user WHERE username? AND password?; // 用 PreparedStatement 防注入别拼字符串 User u queryOne(sql, username, password); if (u null) { throw new RuntimeException(账号或密码错误); } return u; // 调用方根据 u.getRole() 决定进哪个界面 }逻辑说明?占位符配合PreparedStatement是防 SQL 注入的基本功别用字符串拼接。queryOne是封装的查询方法返回 null 表示没查到。角色判断放在调用方比如if (admin.equals(u.getRole()))就打开管理主窗否则打开教师窗。参数上密码如果数据库存的是明文建议至少加一层 MD5 或 BCrypt改的时候同步改注册和登录两处。4.3 界面字段与数据库字段的映射检查改需求时最容易翻车的地方是「界面加了字段数据库没加列」或者反过来。我一般会拉一张对照表把界面控件、Java 实体属性、数据库列名三列对齐改之前先看这张表。界面控件实体属性数据库列类型学号输入框studentIdstudent_idvarchar(20)姓名输入框studentNamestudent_namevarchar(50)班级下拉框classNameclass_namevarchar(50)成绩输入框scorescoredecimal(5,2)逻辑说明这张表不用写进代码但改字段时对着看能省很多调试时间。decimal(5,2)表示总共 5 位、小数 2 位最大 999.99够用如果学校有 150 分制或加分项记得把位数放宽。5. 避坑与排查跑不起来时先查这五条这一章按「现象 → 原因 → 解决」写都是我拆这类包时真实遇到过的。现象一启动报ClassNotFoundException: com.mysql.cj.jdbc.Driver。原因驱动 jar 没加进构建路径或者驱动版本与代码里写的类名不匹配老驱动是com.mysql.jdbc.Driver。 解决确认lib下的 jar 已 Add as Library如果代码写的是老类名而 jar 是 8.0.x把类名改成com.mysql.cj.jdbc.Driver或换回 5.1.x 驱动。现象二登录后中文姓名显示成???。原因数据库连接 URL 没带characterEncodingutf8或者建库时字符集是 latin1。 解决URL 补上characterEncodingutf8已建库的执行ALTER DATABASE 库名 CHARACTER SET utf8mb4;表和列也要改最省事是删库按 utf8mb4 重建再导数据。现象三录入成绩后查询不到但数据库里明明有。原因查询条件用了匹配字符串但两边有空格或者事务没提交。 解决检查 Java 里是否trim()了输入确认连接是否设置了autoCommitfalse而代码里忘了commit()。常见做法是查询前先手动在 MySQL 客户端跑一遍同样的 SQL能定位是 SQL 问题还是代码问题。现象四Swing 界面乱码或按钮文字显示成方块。原因IDE 运行时的默认编码与源码文件编码不一致常见于源码是 GBK 而 IDE 按 UTF8 读。 解决在 IDE 的运行配置里加-Dfile.encodingGBK或-Dfile.encodingUTF-8与源码实际编码对齐实在不行用记事本另存为 UTF-8 再重新编译。现象五换台电脑就报Access denied for user rootlocalhost。原因配置文件里写的是别人机器的密码或者 MySQL 8 的root默认不允许远程/本地密码登录方式差异。 解决改成你本机密码如果本机 MySQL 8 用caching_sha2_password而驱动太老要么升级驱动到 8.0.x要么改用户认证插件。别去改 MySQL 的my.ini跳过权限表那是给自己挖坑。提示排查顺序永远是「先库后码、先配置后逻辑」别一上来就怀疑代码写错了。6. 二次开发起步把现成骨架改成你自己的业务模块跑通之后这份资源最大的价值是当骨架用。我一般会先做三件事把包名和项目名换成自己的、把student表按新业务改名、把登录角色扩展成自己需要的。下面给一个改表名和实体类的具体手法以及验证改完没改崩的方法。6.1 批量替换表名与实体名的安全做法别在 IDE 里全局替换student这个词因为student_id、student_name也会被误伤。正确做法是先改数据库再改实体类最后改 SQL 字符串。-- 先把表改名列名保持不变减少代码改动量 RENAME TABLE student TO t_member; -- 如果业务需要再加新列 ALTER TABLE t_member ADD COLUMN phone VARCHAR(20) DEFAULT NULL;逻辑说明只改表名不改列名Java 里SELECT * FROM student改成SELECT * FROM t_member即可实体属性名不用动。加列时给默认值避免已有数据插入报错。改完在 MySQL 里SELECT * FROM t_member LIMIT 5;确认数据还在。6.2 用最小回归清单验证改动没破坏原功能改完别凭感觉说「应该没问题」跑一遍清单登录 → 新增一条成员 → 查询刚新增的 → 修改它 → 删除它 → 再查确认没了。这五步覆盖了增删改查主链路任何一步报错都能快速定位到是哪层改坏了。# 如果项目有单元测试目录跑一遍没有就手动走清单 mvn test逻辑说明mvn test只在项目是 Maven 结构时有意义非 Maven 项目就手动点界面。手动走的时候开着控制台看异常栈比只看弹窗提示有用得多。6.3 一个我常用的习惯从那以后我每次拿到这类压缩包都先复制一份原始包到备份目录再在副本上改数据库脚本也先mysqldump一份再动结构。改配置只改一处、改表名只改一层、改完必走五步回归。这套习惯让我少熬了很多个「明明只改了一行却全崩了」的夜。希望帮到你。本文还有配套的精品资源点击获取