
简介这是一份基于Java与MySQL的学生成绩管理系统完整项目面向正在学习Java GUI编程、数据库交互以及软件工程实践的开发者尤其适合作为课程设计或毕业设计的参考案例。压缩包内共104个文件包含29个Java源码、68个编译后的class文件另有两个jar依赖库、项目配置与一份docx说明文档整体大小仅714KB结构明了可直接导入开发环境查看运行便于按模块阅读和调试。项目覆盖学生信息管理、成绩录入与查询、数据统计分析、选课管理以及用户权限控制等功能模块从界面布局、事件监听、JDBC连接到SQL增删改查均有体现形成完整的业务闭环。已有600人学习下载对于希望理解图形界面与MySQL后端结合、掌握实际项目分层结构的初学者这份资源能提供清晰的代码参照和设计思路帮助快速上手。1. Java学生成绩管理系统.rar期末成绩录入为什么需要这样一个Java小系统Java学生成绩管理系统.rar 这类压缩包是计算机课程设计里最常见的交付物。期末成绩登记基本靠Excel来回传轻则格式错乱重则成绩覆盖一个学期一次的返工就够让人崩溃。这个Java小系统把学生信息维护、成绩录入、查询统计放进一个工程解压、导入IDE、配上MySQL就能跑。适合刚学完Java基础的人也适合被安排做教学管理原型的一线从业者。不过拿到包先别急着双击运行先认清它是Web项目还是桌面程序这两种形态的导入、启动和排错路径完全不同。花两分钟确认结构能省掉一整晚的环境问题。2. 把.rar变回可运行工程JDK版本检查与IDE导入步骤2.1 解压前先看包结构源码、SQL脚本和说明文档先从解压说起。拿到Java学生成绩管理系统.rar在Windows上我一般用WinRAR双击解压在Linux或macOS上用unrar命令行# 安装unrar后执行 unrar x Java学生成绩管理系统.rar -d ./student-score-system/参数里x表示保留压缩包内完整目录结构并解压-d指定输出目录。这一步别直接在压缩包窗口里双击找文件那样临时文件和解压内容混在一起容易把项目路径搞乱。解压完先别急着打开IDE花两分钟把目录结构看一遍判断这个包是什么形态。我见过两种最常见的布局student-score-system/ ├── src/ # Java源码 │ └── com/example/ │ ├── entity/ # 实体类Student、Score │ ├── dao/ # 数据访问层 │ ├── servlet/ # Web控制层 │ └── util/ # 数据库连接工具类 ├── web/ # Web根目录 │ ├── WEB-INF/ │ │ ├── web.xml │ │ └── classes/ │ └── login.jsp ├── sql/ │ └── init.sql # 建库建表脚本 └── README.md # 项目说明如果看到src下有Main.java而web目录不存在那是Swing或JavaFX桌面程序有web/WEB-INF和web.xml就是Servlet/JSP的Web应用。Java学生成绩管理系统.rar里最常见的是Web形态课程设计通常要求B/S架构老师用浏览器访问就行不用每台机器都装客户端。接下来看README.md里面通常会写死三件事JDK版本、MySQL版本、Tomcat版本。这三个版本对能不能一次跑通影响最大。有的包README写得很随意只留一句用IDEA打开即可这时候就要靠下一步的环境检查兜底。2.2 JDK与IDE版本匹配避免一导入就报错Java版本不匹配是导入期的第一大坑。老项目用JDK 8编译新电脑装了JDK 17或21一打开不一定立刻报错最怕的是运行到中途抛UnsupportedClassVersionError。命令行先确认当前环境# 查看当前Java版本 java -version javac -version如果输出带1.8.0_那就是JDK 8如果是17.0.x或21.0.x要注意项目是否依赖只在JDK 8下存在的内部API。常见做法是装一个JDK 8在IDE里给这个项目单独指定Project SDK为8而不是动全局环境变量。IDEA里File - Project Structure - Project SDK下拉换成8再把Language Level设成8。这里多说一句java环境配置的问题也是经典痛点机器上装了多个JDK环境变量JAVA_HOME指来指去命令行java -version和IDE里用的不是同一个。我处理这类压缩包的习惯是不依赖系统JAVA_HOME在IDE里给Project SDK指定绝对路径比如C:\Program Files\Java\jdk1.8.0_202这样系统环境变量乱不乱都不影响项目本身。2.3 IDEA导入Web工程与桌面工程的标准操作确认JDK后用IDEA导入。Web版的步骤是File - New - Project from Existing Sources选中解压后的根目录如果有pom.xml就选pom.xml否则直接选根目录把src目录标记为Sources Rootweb目录标记为Web ResourcesRun - Edit Configurations - Add New - Tomcat Server - Local在Deployment页签里加上ArtifactApplication context填项目名就行Eclipse则简单一些File - Import - Existing Projects into Workspace选根目录Eclipse会读取.classpath和.project文件自动识别工程。如果是Maven工程压缩包里会有pom.xmlIDEA识别后会把依赖全部拉下来最省事。但很多课程设计不用Maven而是把mysql-connector-java.jar直接放在lib目录下手动管理。这种情况下IDEA里需要右键lib目录 - Add as Library把jar加进依赖。这个动作漏掉的话编译能过但运行时会报ClassNotFoundException: com.mysql.cj.jdbc.Driver。桌面版导入更简单IDEA直接Open项目根目录如果源码目录结构清晰右键Main类就能Run。需要额外注意的是桌面版通常要把lib/下的驱动jar也Add as Library。这一步做完项目才能在编译期和运行期同时找到JDBC驱动类。3. 核心代码走读两张表、实体类与增删改查怎么做3.1 建表SQLstudent与score的主外键关系打开sql/init.sql最核心的是两张表student学生和score成绩。典型的建表语句是CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARSET utf8mb4; USE student_db; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 学号, student_name VARCHAR(50) NOT NULL COMMENT 姓名, class_name VARCHAR(50) COMMENT 班级, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB COMMENT学生表; CREATE TABLE score ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, course_name VARCHAR(50) NOT NULL COMMENT 课程名称, score DECIMAL(5,2) NOT NULL COMMENT 成绩, exam_time DATE COMMENT 考试日期, FOREIGN KEY (student_id) REFERENCES student(id) ) ENGINEInnoDB COMMENT成绩表;字段设计上需要注意student_no加了UNIQUE约束防止同一个学号录入两次score表用student_id做外键而不是直接存学号字符串这是第三范式的考虑——学生表里修改姓名后成绩表不需要跟着改。DECIMAL(5,2)表示最长5位数字、保留2位小数99.99这样的分值都能存比FLOAT更适合存成绩浮点类型算平均分时会出现精度漂移。很多新手喜欢把学生姓名直接冗余到score表查询确实少一个JOIN但代价是学生改名的场景要同步改两处这是典型的更新异常。这段关系建模几乎是java面试题里数据一致性问题的常客建议按主外键设计走。3.2 实体类与DAOJava数据类型映射到MySQL字段对应上面的建表SQLentity包里的Student.java和Score.java核心字段如下// Student.java 实体类 public class Student { private Integer id; // 对应数据库id INT private String studentNo; // 对应student_no VARCHAR private String studentName; // 对应student_name VARCHAR private String className; // 对应class_name VARCHAR // getter/setter用IDE自动生成 }学生表四个字段用Integer和String对应INT和VARCHAR这是Java数据类型与MySQL字段最直接的映射。成绩表注意一点DECIMAL在Java侧用BigDecimal或Double接收不要用Float。Float在累加和求平均时精度损耗明显这是面向对象编程java里封装基础类型时容易忽略的点。DAO层写法几乎是java八股文里手写JDBC的经典片段// ScoreDao.java 核心方法 public class ScoreDao { private static final String DRIVER com.mysql.cj.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/student_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private static final String USER root; private static final String PASSWORD 123456; public ListScore listByStudent(Integer studentId) { String sql SELECT * FROM score WHERE student_id ? ORDER BY course_name; ListScore list new ArrayList(); try (Connection conn DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, studentId); try (ResultSet rs ps.executeQuery()) { while (rs.next()) { Score score new Score(); score.setId(rs.getInt(id)); score.setStudentId(rs.getInt(student_id)); score.setCourseName(rs.getString(course_name)); score.setScore(rs.getBigDecimal(score)); list.add(score); } } } catch (SQLException e) { e.printStackTrace(); } return list; } }参数说明三个关键点useSSLfalse关闭MySQL 8.x默认的SSL安全连接校验不关会报SSL握手警告甚至连接失败serverTimezoneAsia/Shanghai解决驱动和数据库服务器的时区偏差characterEncodingutf8让中文不乱码。try-with-resources语法在JDK 7以上可用能自动关闭Connection、PreparedStatement、ResultSet等资源比老式手动finally.close更安全也是现在主流的写法。3.3 Servlet控制层成绩录入和查询的请求链路Web版里控制层通常是三个ServletLoginServlet验证账号StudentServlet管学生信息ScoreServlet管成绩。以成绩录入为例请求链路是浏览器提交score表单 - web.xml或WebServlet注解路由到ScoreServlet - doPost接收参数 - 组装Score对象 - 调用ScoreDao.insert - 重定向回listScore.jsp// ScoreServlet.java 核心片段 WebServlet(/score/add) public class ScoreServlet extends HttpServlet { private ScoreDao scoreDao new ScoreDao(); Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); Integer studentId Integer.valueOf(req.getParameter(studentId)); String courseName req.getParameter(courseName); BigDecimal scoreValue new BigDecimal(req.getParameter(scoreValue)); Score score new Score(); score.setStudentId(studentId); score.setCourseName(courseName); score.setScore(scoreValue); boolean ok scoreDao.insert(score); if (ok) { resp.sendRedirect(list.jsp?studentId studentId); } else { req.setAttribute(error, 成绩插入失败); req.getRequestDispatcher(error.jsp).forward(req, resp); } } }WebServlet(/score/add)是Servlet 3.0的注解路由省去web.xml里写一堆Mapping配置。req.setCharacterEncoding(UTF-8)必须放在doPost最前面因为POST请求体的编码在第一次读取参数前就要确定放晚了读出来的中文全是问号。这条链路走通后学生成绩管理系统最核心的录入一条成绩就完整了。查询和统计在此基础上扩展按学号查、按班级查、按课程查SQL里加AVG(score)算平均分加COUNT(*)算人数再加SUM(score)做总分统计。这部分代码走读清楚基本就掌握了整个项目的五脏六腑。4. 让系统跑起来MySQL初始化、JDBC连接与Tomcat配置4.1 SQL脚本导入与初始数据验证数据库脚本导入前先确认MySQL版本。课程设计包最常见的适配范围是MySQL 5.7和8.0执行导入mysql -u root -p sql/init.sql输入密码后没有任何报错回到命令行说明脚本执行成功。紧接着验证数据是否进去了mysql -u root -p -e USE student_db; SHOW TABLES; SELECT * FROM student;如果init.sql里没有CREATE DATABASE语句需要先手动建库再导入。另外提醒一句有的课程设计脚本为了演示方便开头是DROP DATABASE IF EXISTS student_db这种脚本导入前一定逐行看一遍别把本机已有的同名库误删了。这是个黑匣子操作不看脚本直接跑翻车概率很高。4.2 JDBC驱动版本与连接URL参数配置前面ScoreDao里出现过JDBC三要素URL、驱动类、账号密码。大多数情况下只需要改USER和PASSWORD但有个高频坑是驱动类和MySQL版本不匹配MySQL版本驱动类名5.7及以前com.mysql.jdbc.Driver8.0及以上com.mysql.cj.jdbc.Driver如果驱动类名和版本不匹配启动时报ClassNotFoundException或Loading class com.mysql.jdbc.Driver failed。另一个麻烦是驱动jar包版本过旧比如lib目录里放的是mysql-connector-java 5.1.x而本机MySQL是8.0虽然驱动类名改成com.mysql.cj.jdbc.Driver但MySQL 8默认认证方式是caching_sha2_password旧驱动不认报Public Key Retrieval is not allowed。解决办法有两种一是换到8.x版本的驱动jar二是URL后面追加allowPublicKeyRetrievaltrue。我一般选择换jar包因为新驱动的SSL和时区处理更完善顺手把useSSLfalseserverTimezoneAsia/Shanghai补上一次到位。// DBUtil.java 连接池版本适合稍微进阶的工程 public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/student_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private static final String USER root; private static final String PASS 123456; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASS); } }提示不要把数据库密码硬编码后提交到Git仓库。课程设计包里没有部署环境但养成从properties文件读密码的习惯对以后进团队协作很重要。4.3 配置Tomcat并验证登录流程Web版启动流程IDEA里配置好Tomcat后点绿色三角启动启动日志出现Server startup in [xxx] milliseconds后浏览器访问http://localhost:8080/项目名进入登录页找到README或init.sql里的初始账号密码初始账号最常见的是admin / admin或admin / 123456。查初始账号有个技巧在IDEA里全局搜索login相关字符串或者直接打开LoginServlet看它从哪个表取账号。有时账号不存数据库而是在代码里硬编码搜索equals(admin)就能定位到。如果压缩包里是桌面版启动方式更简单右键Main类Run Main.main()控制台会弹出窗口界面。桌面版通常不需要Tomcat但数据库连接依然要配置到位。启动成功后第一时间测试两个动作录入一条成绩、按学号查询这条成绩确认链路是通的。5. 常见问题避坑指南五处高概率翻车与排查5.1 中文乱码问号和口口从哪来三层编码一次调对现象页面显示学生姓名变成张??或者寮犱笁这类乱码。原因三层编码不一致——文件本身是GBK编码、数据库表用utf8mb4、页面contentType写的ISO-8859-1任何一个不对齐都会出问题。解决第一步IDEA右下角File Encoding先看是GBK还是UTF-8如果是GBK就把文件另存为UTF-8。第二步确认JSP页面头部有pageEncodingUTF-8。第三步数据库连接URL带上characterEncodingutf8。三层全对齐中文才稳定。乱码是全链路问题不要只改一处就指望好。5.2 JDBC驱动加载失败与连接超时版本和端口逐个排查现象运行报ClassNotFoundException: com.mysql.cj.jdbc.Driver或者Communications link failure。原因前者是jar没引入或驱动类名写错后者是MySQL没启动、端口不对、或防火墙拦截。解决驱动类名按上面章节的表格对照。连接超时先确认MySQL能不能连mysql -u root -p -h 127.0.0.1 -P 3306能连上再看项目URL端口是否写的3306有的机器装了宝塔面板MySQL端口被改成3307URL没跟着改就连不上。确认端口后还报错用telnet 127.0.0.1 3306或nc -zv 127.0.0.1 3306验证TCP层通不通。5.3 Tomcat端口被占用改端口比杀进程更省心现象启动Tomcat时控制台报Port 8080 is already in use。原因上次启动的Tomcat没完全关闭或者机器上刚好有别的进程占了8080。解决在Run Configuration里把HTTP port改成8081重启Tomcat。这是最省事的做法杀进程容易误伤别的正在跑的服务而且治标不治本。如果改了端口还报占用再看启动日志里有没有第二个Tomcat实例在跑。5.4 中文路径导致资源加载失败搬到纯英文目录现象项目解压在D:\下载\Java学生成绩管理系统\这样的路径下启动后页面图片、CSS加载404或运行时日志出现诡异的路径拼接错误。原因老版本Tomcat和IDEA内置Tomcat对非ASCII路径支持不完善路径里的中文导致资源定位失败。解决把整个项目剪切到纯英文路径比如D:\code\student-score-system。这个坑在Windows上很普遍用户名为中文或解压到桌面、下载目录都会触发。改完路径后记得让IDEA重新识别项目根目录避免旧路径的索引缓存残留。5.5 IDE缓存导致修改不生效重编译和热更新配置现象改了Java代码重新启动Tomcat页面行为还是旧的。原因IDEA没有触发增量编译或Tomcat deployment的exploded目录没有同步最新class文件。解决Build - Rebuild Project强制全量编译还是在Tomcat配置里把On Update action设为RedeployOn frame deactivation设为Update resources。后者配置好后改完代码IDEA会自动更新到Tomcat运行目录省去手动重启。这条血泪经验是在一个bug上耗了一下午总结出来的最后发现只是没编译新的class。6. 进阶验证用排序和日志确认这个成绩系统真的可靠系统能跑只是第一步。我接手这类项目时都会花半小时做三件事确认它不是纸面能跑。第一验证排序逻辑。查询成绩列表时如果原项目用SQL的ORDER BY直接排没问题如果是在Java侧排序把sort函数用法java落到代码里// 按成绩降序用Comparator list.sort((s1, s2) - s2.getScore().compareTo(s1.getScore()));Comparator配合Lambda表达式比手写冒泡排序稳妥得多。Java集合框架底层是归并排序数据量再大也不会栈溢出而自己写的冒泡排序在几百条成绩时性能还行数据量翻倍后就开始卡了。第二在DAO层临时加一行System.out.println打印执行的SQL和受影响行数。插入一条成绩后立刻在数据库里SELECT * FROM score ORDER BY id DESC LIMIT 1看到新记录这比只看页面返回成功更有说服力。第三用一组已知数据反推统计结果。比如录入三名学生成绩80、90、95平均分应该是88.33及格率100%。页面显示88.3还是88.33对照一下四舍五入规则就能揪出浮点精度或格式化问题。这三个验证全过我才敢说这个学生成绩管理系统交付给老师或者作为课程设计提交不会当场翻车。我习惯把这几条验证SQL和命令挂在调试清单里每次拿到同类项目都照着走一遍省得临时拍脑袋。希望帮到你。本文还有配套的精品资源点击获取