SpringBoot+MyBatis-Plus学生成绩管理系统:从数据模型到权限设计实战

发布时间:2026/10/22 11:38:01
SpringBoot+MyBatis-Plus学生成绩管理系统:从数据模型到权限设计实战 简介一份基于SpringBoot的学生成绩管理系统毕业设计资料面向JavaWeb开发者、高校相关专业学生及毕业设计选题者系统围绕管理员、教师、学生三类角色展开覆盖院系管理、考试成绩登记、信息维护、成绩查询、班级通讯录等核心功能适合用于课程设计、毕业设计或技术学习参考。压缩包内为1个docx格式的完整毕业设计报告大小1.14MB正文完整呈现绪论、系统分析、概要设计、系统设计与实现、系统测试等章节从可行性分析、需求分析到数据库概念模型与表结构设计再到管理员端、教师端、学生端各功能模块实现最后给出单元测试与集成测试说明可系统了解SpringBootMySQLJavaWeb项目的开发全流程。目前已有8554人学习浏览实用性强读者可参考其中角色权限划分、教务管理业务逻辑及测试方案快速梳理自身项目的设计思路适合作为毕业设计模板或项目开发前的需求分析参照。1. 学生成绩管理系统为什么说难点从来不在增删改查学期末某高校的教务老师处理三百多人的成绩单Excel 里 VLOOKUP、格式刷、手工核对轮着来稍不留神就把两个学生的分数串了行。这种场景下基于 SpringBoot 的学生成绩管理系统才真正有了意义——它不只是一道增删改查的练习题而是把「录入 → 审核 → 查询 → 统计」这条链路拆成清晰的角色边界和数据规范。这个标题覆盖了最典型的课设与内部工具需求SpringBoot 搭后端MySQL 存数据教师录成绩、学生查成绩、管理员管课程和用户。适合正在做课设或毕设的在校生也适合需要给小团队快速交付一个内部成绩工具的一线开发者。读完你会得到一套能直接复现的骨架以及网上 demo 里很少讲清楚的几个坑。2. 技术选型与骨架搭建SpringBoot MyBatis-Plus 为什么是稳妥组合2.1 选型对比从 SSH 到微服务的取舍早期课设里常见的 SSHStruts Spring Hibernate和 SSMSpring SpringMVC MyBatis并没有消失但新项目里我基本不会选它们。原因很直接XML 配置太碎一个数据源要写四五处action 和 controller 的跳转逻辑绕来绕去学生做课设时大量时间耗在配置上而不是业务上。微服务那套更不适合——一个成绩管理系统拆成四个服务光 service 间调用和注册中心就够喝一壶何况大多数场景就是单机部署、几十人并发。SpringBoot 的优势在于自动配置和内嵌 Tomcat。一个 jar 包直接跑不用装外部容器数据源、MyBatis、Jackson 这些组件通过 starter 统一管理配置集中在 application.yml 里出问题一眼能看到。MyBatis-Plus 在 MyBatis 基础上把单表 CRUD 和分页做成了开箱即用不需要给每张表写一套 XML mapper这对课设和内部工具的效率提升很明显。版本选择上有一个实际约束学校机房或老服务器的 JDK 版本。如果确认环境是 JDK 8就用 SpringBoot 2.7.x如果全新环境能装 JDK 17再考虑 SpringBoot 3.x。不要为了新版本强行上 3.x否则部署时才发现目标机器 JDK 不匹配返工成本很高。方案JDK 要求配置复杂度适合场景SpringBoot 2.7.x MyBatis-Plus 3.5.xJDK 8 及以上低课设、公司内部小工具、老服务器部署SpringBoot 3.x MyBatis-Plus 3.5.xJDK 17 及以上低全新环境、想用 Jakarta EE 新特性SSM 传统组合JDK 8高维护老项目新项目不建议微服务拆分JDK 8/17高多团队协作、需独立扩展的大系统2.2 最小可运行骨架pom.xml 与 application.yml我一般直接用 Maven 工程不依赖 IDE 的向导。先建一个空的 Maven 项目然后写 pom.xml。父工程用 spring-boot-starter-parent 可以统一管理依赖版本省去逐个指定版本号的麻烦。parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.7/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /buildmysql-connector-j 是 MySQL 8 之后的坐标名如果数据库是 MySQL 5.7需要换成 mysql-connector-java。Lombok 用来减少 getter/setter 样板代码但要注意 IDE 里必须装 Lombok 插件否则编译直接报符号找不到。application.yml 是整套配置的核心数据源、MyBatis-Plus、日志都在这里。第一次跑通时配置越简单越好只保留必要项server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/score_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0serverTimezone 必须显式指定否则 MySQL 8 默认时区跟 JVM 不一致查询时间字段会偏移 8 小时甚至直接报错。logic-delete 配置开启逻辑删除后面设计用户表时加一个 deleted 字段删除操作自动变成 UPDATE避免误删成绩数据后找不回来。入口类放在项目根包下只做两件事标注 SpringBootApplication 和扫描 Mapper 接口。MyBatis-Plus 的 Mapper 都是接口不写 XML必须让容器知道去哪里扫描。SpringBootApplication MapperScan(com.example.score.mapper) public class ScoreApplication { public static void main(String[] args) { SpringApplication.run(ScoreApplication.class, args); } }MapperScan 的包路径要和实际 mapper 包一致这个写错了启动会报 mapper bean 找不到。跑起来之后先不要急着写页面用一个最简单的接口验证链路建一张测试表写一个 controller 返回一行数据能通就说明数据源、MyBatis-Plus、Web 三层都正常了。这个步骤看起来基础但能过滤掉大量环境问题后面写业务时不会排查到深夜。3. 数据模型与权限设计五张核心表和三个角色的边界3.1 五张表的结构与关键约束成绩管理系统的核心是成绩数据但成绩不是孤立存在的它关联学生、课程、教师而这三类人又都需要登录账号。网上很多 demo 图省事把用户名密码直接写进学生表和教师表结果就是改密码要动业务表删除学生还要考虑账号残留。我习惯把账号体系单独拆出来做成 sys_user 表业务表和它通过 ref_id 关联职责清晰答辩时也好讲。表结构直接用 MySQL 8 的 SQL 建。注意字符集和排序规则统一用 utf8mb4否则中文和一些特殊符号会乱码。CREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, role VARCHAR(20) NOT NULL, ref_id BIGINT, deleted TINYINT DEFAULT 0, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE student ( id BIGINT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL UNIQUE, student_name VARCHAR(50) NOT NULL, class_name VARCHAR(50), grade_year VARCHAR(10) ); CREATE TABLE teacher ( id BIGINT PRIMARY KEY AUTO_INCREMENT, teacher_no VARCHAR(20) NOT NULL UNIQUE, teacher_name VARCHAR(50) NOT NULL, title VARCHAR(30) ); CREATE TABLE course ( id BIGINT PRIMARY KEY AUTO_INCREMENT, course_name VARCHAR(100) NOT NULL, course_code VARCHAR(30) NOT NULL UNIQUE, credit DECIMAL(3,1) DEFAULT 2.0, teacher_id BIGINT ); CREATE TABLE score ( id BIGINT PRIMARY KEY AUTO_INCREMENT, student_id BIGINT NOT NULL, course_id BIGINT NOT NULL, semester VARCHAR(20) NOT NULL, score DECIMAL(5,2), status TINYINT NOT NULL DEFAULT 0, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_student_course_semester (student_id, course_id, semester) );score 表的唯一键 uk_student_course_semester 是整个防重复设计的核心它从数据库层面保证同一个学生同一门课同一个学期只能有一条成绩记录。很多项目只在代码里先 SELECT 再 INSERT并发或者老师手滑点两次提交时照样插进去重复数据。唯一键约束是最后一道闸INSERT 时如果有重复会抛 DuplicateKeyException代码里捕获处理即可。semester 字段用字符串存格式建议统一成「2024-2025-1」这样的规则跨学年查询时用 LIKE 或者前缀匹配都很方便。成绩用 DECIMAL(5,2) 而不是 FLOAT 或 DOUBLE原因很实际浮点数存 85.5 可能变成 85.499999查询展示时还得再格式化。DECIMAL 是定点数存进去是什么查出来就是什么Java 侧配合 BigDecimal 接收不会出精度幺蛾子。course 表里的 teacher_id 是外键逻辑关联不建物理外键。理由也简单物理外键在删除和更新时约束链太长老师调走时改一条记录可能要连带处理外键冲突而逻辑关联通过 SQL JOIN 就能拿到完整数据性能影响可以忽略。3.2 登录认证与权限控制不用 Spring Security 的做法成绩系统天然有三种角色管理员、教师、学生。管理员管课程和账号教师录成绩和看统计学生只能查自己的成绩。权限设计如果搞不好最典型的翻车就是学生拿接口文档直接调 URL 看全班成绩。Spring Security 功能强大但过滤器链、UserDetailsService、SecurityContext 这些概念对课设来说是个黑匣子配置稍微错一点整个应用起不来排查成本高。我一般用 HandlerInterceptor 加自定义注解做角色权限代码量不到五十行逻辑透明答辩时能讲清楚每一步在做本文还有配套的精品资源点击获取