ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Java学生成绩管理系统课设源码解析:Gradle构建与MySQL实战

Java学生成绩管理系统课设源码解析:Gradle构建与MySQL实战 简介这份资源是基于Java与MySQL的学生成绩管理分析系统项目源码面向学习Java Web开发、数据库应用或课程设计的学生与开发者帮助理解教育信息化场景下成绩管理系统的完整实现思路。压缩包共18个文件约62KB以xml配置文件、iml模块描述、gradle构建脚本为主另含properties配置、java源码、jar依赖与bat/gradlew启动脚本覆盖项目构建、IDE配置与核心业务代码结构紧凑便于快速导入运行。目前已有29人学习下载。系统围绕学生信息管理、成绩录入与查询、成绩统计与分析、系统管理、成绩预警通知及数据接口等模块展开读者可从中掌握Java面向对象设计、MySQL数据表操作、成绩报表生成与权限控制等实践要点适合作为课程设计参考或二次开发基础也可用于理解成绩趋势分析与家校通知等业务逻辑的落地方式。1. 从一份 Java 课设压缩包说起成绩管理系统到底能跑出什么如果你正在搜「java课程设计案例源码」大概率会刷到一堆只有登录页的壳子项目。我手上这份基于java和mysql 的学生成绩管理系统.zip不太一样它带完整 Gradle 构建、IntelliJ 工程文件和EnterGui.java入口属于那种解压完配好数据库就能直接跑起来的类型。核心价值在于它把「学生信息管理 成绩录入查询 统计分析 权限控制」这条主线串通了不是只给你一个空架子。适合两类人一是要交课程设计、需要能演示完整流程的学生二是刚学完 Java 基础、想找一个带真实数据库交互的项目练手的后端新人。它解决的不是「教你 Java 语法」而是「让你看到一个能用的管理系统长什么样、数据怎么从界面流到 MySQL 再流回来」。2. 拆开压缩包看结构Gradle 工程与 GUI 入口怎么对上2.1 目录清单与构建体系解压后第一眼看到的不是一堆散乱的.java而是一个标准 Gradle 工程。build.gradle和settings.gradle负责依赖与模块声明gradlew/gradlew.bat是跨平台的构建脚本gradle目录里放的是 wrapper 配置。work1.iml和.idea目录说明它原本就是在 IntelliJ IDEA 里开发的uiDesigner.xml暗示界面可能用到了 GUI Designer 或者至少是可视化布局工具生成的。src下是真正的源码EnterGui.java是入口类StudentManage是业务包。常见做法是先用gradlew build验证依赖能不能拉下来再决定是直接在 IDE 里跑还是命令行跑。我一般会先看build.gradle里的dependencies块确认 MySQL 驱动版本和是否引入了连接池。如果只有mysql-connector-java而没有 HikariCP 或 Druid说明这个项目走的是最朴素的DriverManager路线对课设来说够用但你要知道它的边界在哪。# 查看 Gradle 版本和任务列表确认 wrapper 可用 ./gradlew --version ./gradlew tasks --all | grep -i run这两条命令不涉及任何业务逻辑纯粹是确认构建环境。--version会输出 Gradle 版本和 JVM 信息如果这里报Unsupported class file major version说明你的 JDK 版本和项目要求的版本对不上。tasks --all列出所有可执行任务找run或application相关的任务名后面启动时要用。2.2 入口类与界面初始化路径EnterGui.java从命名看就是「进入图形界面」的意思。它大概率继承自JFrame或者调用SwingUtilities.invokeLater来启动主窗口。Swing 的坑在于所有 UI 操作必须在事件分发线程EDT里执行如果你直接在main方法里new JFrame().setVisible(true)短时间看不出问题但一旦有耗时操作就会界面卡死。// 典型的 Swing 入口写法放在 EnterGui.java 里 public class EnterGui { public static void main(String[] args) { // 把 UI 创建放到 EDT 里避免线程安全问题 SwingUtilities.invokeLater(() - { LoginFrame login new LoginFrame(); login.setVisible(true); }); } }逻辑说明invokeLater把LoginFrame的创建和显示排进 EDT 队列保证所有组件操作在同一个线程里。参数方面LoginFrame是你自己写的登录窗口类构造里通常会初始化文本框、按钮和布局管理器。如果你把这段改成直接new LoginFrame()在单机演示时可能没事但一旦加上数据库查询的 loading 动画就会翻车。2.3 数据库连接配置的落点项目里没有application.properties或application.yml说明数据库配置大概率硬编码在某个DBUtil类里或者写在src下的某个.properties文件里。你需要找到类似jdbc:mysql://localhost:3306/student_score这样的字符串然后确认三件事数据库名、用户名、密码。// 常见的 JDBC 工具类写法参数需要你按本地环境改 public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/student_score?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue; private static final String USER root; private static final String PASSWORD 你的密码; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }useSSLfalse在本地开发时避免证书警告serverTimezoneAsia/Shanghai解决时区导致的The server time zone value报错allowPublicKeyRetrievaltrue是 MySQL 8.0 之后 caching_sha2_password 插件需要的参数。这三个参数少一个都可能连不上尤其是 MySQL 8.0 默认认证插件变了之后很多老教程的配置直接失效。3. 把数据库跑起来建库建表与初始数据导入3.1 建库建表的 SQL 顺序项目压缩包里不一定带.sql文件但一个能跑的成绩管理系统至少需要student、score、user三张表。常见做法是手动建库然后按业务实体逐个建表。顺序很重要先建student和user再建score因为score表通常有外键指向student。-- 建库字符集用 utf8mb4 避免中文乱码 CREATE DATABASE IF NOT EXISTS student_score DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE student_score; -- 学生表学号做主键姓名和班级是基本字段 CREATE TABLE student ( student_id VARCHAR(20) PRIMARY KEY, name VARCHAR(50) NOT NULL, gender CHAR(1) DEFAULT 男, age INT, class_name VARCHAR(50) ); -- 成绩表用自增 id 做主键外键关联学生 CREATE TABLE score ( id INT AUTO_INCREMENT PRIMARY KEY, student_id VARCHAR(20), course_name VARCHAR(50), score DECIMAL(5,2), exam_date DATE, FOREIGN KEY (student_id) REFERENCES student(student_id) ); -- 用户表存登录账号和角色 CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(100) NOT NULL, role VARCHAR(20) DEFAULT teacher );utf8mb4比utf8更完整能存 emoji 和生僻字虽然成绩系统用不到 emoji但养成习惯没坏处。DECIMAL(5,2)表示总共 5 位、小数 2 位最大 999.99足够存百分制成绩。外键约束保证不会出现「成绩表里有某个学号但学生表里没有」的脏数据代价是插入顺序必须先是学生后是成绩。3.2 初始账号与测试数据的插入系统跑起来第一件事是登录所以user表里至少要有一条记录。密码如果项目里用的是明文比较那直接插明文如果用了 MD5 或 BCrypt你需要看LoginFrame或对应的UserDao里怎么比对的。-- 插入一个管理员账号密码按项目实际逻辑决定是否加密 INSERT INTO user (username, password, role) VALUES (admin, 123456, admin); -- 插入两个学生和对应成绩方便测试查询和统计 INSERT INTO student (student_id, name, gender, age, class_name) VALUES (2024001, 张三, 男, 20, 计算机2401), (2024002, 李四, 女, 19, 计算机2401); INSERT INTO score (student_id, course_name, score, exam_date) VALUES (2024001, Java程序设计, 88.50, 2024-06-20), (2024001, MySQL数据库, 92.00, 2024-06-22), (2024002, Java程序设计, 76.00, 2024-06-20);插入完用SELECT * FROM score WHERE student_id 2024001验证一下如果中文显示成???说明连接 URL 里没加characterEncodingutf8或者数据库建库时字符集不对。这个坑在 Windows 上尤其常见因为 MySQL 安装时默认字符集可能是latin1。3.3 连接池要不要上课设场景的取舍原始项目大概率用DriverManager每次查询新建连接。这在单用户演示时没问题但如果你要模拟多用户并发或者面试时被问到「你的数据库连接怎么管理的」就需要知道连接池的价值。常见做法是引入 HikariCP改DBUtil从池里拿连接。// 用 HikariCP 替换 DriverManager 的改法 HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/student_score?useSSLfalseserverTimezoneAsia/Shanghai); config.setUsername(root); config.setPassword(你的密码); config.setMaximumPoolSize(10); HikariDataSource dataSource new HikariDataSource(config); // 获取连接时从池里拿 Connection conn dataSource.getConnection();maximumPoolSize10对课设足够生产环境要根据数据库max_connections和实际并发调。改完之后记得在build.gradle里加implementation com.zaxxer:HikariCP:5.0.1版本号按你 JDK 版本选JDK 8 用 4.xJDK 11 用 5.x。这一步不是必须的但做了之后你对「连接管理」的理解会上一个台阶。4. 成绩统计与查询从 SQL 聚合到界面展示的链路4.1 统计分析的 SQL 写法成绩管理系统的「分析」部分核心就是几个聚合查询平均分、最高分、最低分、排名、分布。这些用一条 SQL 就能出结果不需要在 Java 里循环累加。-- 每个学生的总分和平均分 SELECT s.student_id, st.name, SUM(s.score) AS total, AVG(s.score) AS avg_score, COUNT(*) AS course_count FROM score s JOIN student st ON s.student_id st.student_id GROUP BY s.student_id, st.name ORDER BY avg_score DESC; -- 每门课程的成绩分布按分数段统计人数 SELECT course_name, SUM(CASE WHEN score 90 THEN 1 ELSE 0 END) AS excellent, SUM(CASE WHEN score 80 AND score 90 THEN 1 ELSE 0 END) AS good, SUM(CASE WHEN score 60 AND score 80 THEN 1 ELSE 0 END) AS pass, SUM(CASE WHEN score 60 THEN 1 ELSE 0 END) AS fail FROM score GROUP BY course_name;第一条 SQL 的JOIN把学生姓名带出来GROUP BY按学号和姓名分组ORDER BY avg_score DESC让平均分高的排前面。第二条用CASE WHEN做条件计数这是做成绩分布图的数据源。如果你在界面上要画柱状图或饼图直接把这条查询的结果集传给图表库就行不需要在 Java 里再算一遍。4.2 查询模块的参数化与防注入成绩查询通常支持按学号、姓名、课程名模糊查。新手容易写成字符串拼接比如SELECT * FROM score WHERE student_id input 这就给 SQL 注入留了口子。正确做法是用PreparedStatement。// 按学号和课程名组合查询参数化防止注入 public ListScore queryScores(String studentId, String courseName) throws SQLException { StringBuilder sql new StringBuilder( SELECT sc.*, st.name FROM score sc JOIN student st ON sc.student_id st.student_id WHERE 11 ); ListObject params new ArrayList(); if (studentId ! null !studentId.isEmpty()) { sql.append( AND sc.student_id ?); params.add(studentId); } if (courseName ! null !courseName.isEmpty()) { sql.append( AND sc.course_name LIKE ?); params.add(% courseName %); } try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql.toString())) { for (int i 0; i params.size(); i) { ps.setObject(i 1, params.get(i)); } ResultSet rs ps.executeQuery(); // 遍历 rs 封装成 ListScore 返回 } }WHERE 11是个小技巧让后面的AND条件可以无脑拼接不用判断是不是第一个条件。LIKE ?配合% courseName %实现模糊匹配但注意%是加在参数值里的不是拼在 SQL 字符串里这样PreparedStatement才能正确转义。try-with-resources保证连接和语句自动关闭避免连接泄漏。4.3 界面表格与数据模型的绑定Swing 里展示表格用JTable数据模型用DefaultTableModel或自定义AbstractTableModel。常见做法是查询返回ListScore然后遍历列表往DefaultTableModel里addRow。// 把查询结果填充到 JTable String[] columns {学号, 姓名, 课程, 成绩, 考试日期}; DefaultTableModel model new DefaultTableModel(columns, 0); for (Score s : scoreList) { model.addRow(new Object[]{ s.getStudentId(), s.getName(), s.getCourseName(), s.getScore(), s.getExamDate() }); } JTable table new JTable(model);DefaultTableModel的第二个参数0表示初始行数为零后面用addRow逐行加。如果你在查询前不清空模型多次查询会叠加数据这是新手常犯的错。正确做法是在填充前调model.setRowCount(0)清空。另外JTable默认不可编辑如果你希望成绩可以双击修改需要重写isCellEditable或者用setModel后单独处理编辑事件。5. 避坑与排查连不上库、乱码、打包失败怎么救5.1 现象启动报Communications link failure原因通常是 MySQL 服务没启动或者端口不是 3306或者防火墙拦了。先net start mysqlWindows或systemctl status mysqlLinux确认服务在跑。如果服务正常用mysql -u root -p能登进去但 Java 连不上检查 URL 里的端口和主机名。还有一种情况是 MySQL 8.0 的caching_sha2_password插件导致老驱动不兼容解决方法是升级mysql-connector-java到 8.0.x或者在 URL 加allowPublicKeyRetrievaltrueuseSSLfalse。5.2 现象中文存进去变成问号原因链条有三层数据库字符集、表字符集、连接字符集。先SHOW VARIABLES LIKE character%看character_set_server和character_set_database是不是utf8mb4。如果不是建库时就要指定。然后检查连接 URL 有没有characterEncodingutf8。最后检查 Java 源文件编码是不是 UTF-8IDEA 里File - Settings - Editor - File Encodings三个都设成 UTF-8。三层都对了才不会乱码。5.3 现象gradlew build报Could not resolve mysql-connector-java原因是 Gradle 仓库里找不到这个依赖或者版本号写错了。常见做法是把build.gradle里的repositories加上mavenCentral()然后确认依赖坐标是mysql:mysql-connector-java:8.0.33这种格式。如果公司内网有私服还要加maven { url 私服地址 }。另一个可能是 Gradle 版本太老不支持新的依赖解析规则用./gradlew wrapper --gradle-version 8.5升级 wrapper。5.4 现象界面能显示但按钮点了没反应原因通常是事件监听没绑上或者绑在了错误的组件上。检查addActionListener是不是加在了按钮实例上而不是加在了JFrame或JPanel上。还有一种情况是actionPerformed里抛了异常但被吞了界面看起来没反应。在actionPerformed第一行加e.printStackTrace()或者用日志框架输出能看到真实报错。Swing 的异常默认打到控制台如果你用javaw启动没有控制台就什么都看不到。5.5 现象打包成 jar 后双击没反应原因是 manifest 里没指定Main-Class或者依赖没打进去。用gradlew jar打出来的 jar 默认不含依赖需要shadowJar插件或者手动配manifest。常见做法是在build.gradle里加application插件然后gradlew run能跑gradlew installDist会生成带启动脚本的目录比直接打 jar 省心。如果非要单 jar用 Shadow 插件把所有依赖合并进去。6. 进阶玩法把成绩预警做成可配置的阈值规则原始项目里如果已经有成绩预警模块大概率是硬编码一个 60 分阈值。我一般会把它改成可配置的用一张warning_rule表存课程和阈值查询时动态读取。这样不同课程可以设不同及格线比如实践课 70 分才算过。CREATE TABLE warning_rule ( id INT AUTO_INCREMENT PRIMARY KEY, course_name VARCHAR(50), min_score DECIMAL(5,2), enabled TINYINT DEFAULT 1 ); INSERT INTO warning_rule (course_name, min_score) VALUES (Java程序设计, 60.00), (MySQL数据库, 65.00);然后在查询成绩时关联这张表找出低于阈值的记录SELECT sc.student_id, st.name, sc.course_name, sc.score, wr.min_score FROM score sc JOIN student st ON sc.student_id st.student_id JOIN warning_rule wr ON sc.course_name wr.course_name WHERE sc.score wr.min_score AND wr.enabled 1;这个查询的结果就是预警名单。你可以把它导出成 CSV或者用 JavaMail 发邮件但课设场景下导出文件更实际。验证方法很简单插一条低于阈值的成绩跑查询看能不能命中再把enabled改成 0确认该规则被跳过。我习惯在改完任何 SQL 后先用EXPLAIN看一眼执行计划确认没走全表扫描尤其是score表数据量大了之后course_name上最好加索引。从那以后我每次拿到一个课设项目都强制先跑通「建库 → 连库 → 查一条数据 → 界面显示」这条最小闭环再去看业务逻辑。这份资源的价值不在于代码多优雅而在于它给了一个能跑通的起点你可以在上面改出自己需要的任何功能。希望帮到你。本文还有配套的精品资源点击获取
返回列表