学生成绩管理系统Java实战(Spring Boot+MyBatis Plus)

文章目录

一、系统需求分析(避坑指南)

咱们先来盘盘这个系统的核心需求(别一上来就撸代码!):

  1. 成绩录入模块:支持Excel批量导入(这个坑最多!)
  2. 多维度查询:按学生/课程/学期组合查询(SQL要写好索引)
  3. 统计分析:自动计算平均分/最高分/挂科率(注意浮点数精度)
  4. 权限控制:教师和管理员不同操作权限(RBAC模型安排)
  5. 数据导出:生成美观的PDF成绩单(别用iText,有坑!)

二、技术选型(2024新版)

java 复制代码
// 技术栈配置(比传统SSM香多了!)
implementation 'org.springframework.boot:spring-boot-starter-web:3.2.4'
implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.5'
implementation 'com.alibaba:easyexcel:3.3.3'  // Excel处理神器
implementation 'org.flywaydb:flyway-core:9.22.3'  // 数据库版本控制
runtimeOnly 'com.mysql:mysql-connector-j:8.0.33'  // 必须用8.x驱动!

三、数据库设计(三大核心表)

1. 学生表(student)

字段名 类型 说明
student_id BIGINT 学号(雪花算法生成)
name VARCHAR(20) 真实姓名
gender TINYINT 0-男 1-女
class_name VARCHAR(50) 班级名称

2. 课程表(course)

sql 复制代码
CREATE TABLE `course` (
  `course_id` INT NOT NULL AUTO_INCREMENT,
  `course_name` VARCHAR(50) NOT NULL COMMENT '课程名称',
  `credit` DECIMAL(3,1) NOT NULL COMMENT '学分',
  `teacher_id` BIGINT NOT NULL COMMENT '授课教师',
  PRIMARY KEY (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. 成绩表(score)

注意! 这里使用联合主键避免重复成绩:

java 复制代码
@Data
@TableName("score")
public class Score {
    @TableId(type = IdType.INPUT)
    private Long studentId;  // 学号
    private Integer courseId; // 课程ID
    private BigDecimal score; // 考试成绩
    private String semester;  // 学期(如2023-2024-1)
}

四、核心功能实现(附避坑代码)

1. Excel批量导入(百万级数据不卡顿)

java 复制代码
@PostMapping("/import")
public void importExcel(@RequestParam MultipartFile file) {
    EasyExcel.read(file.getInputStream(), ScoreData.class, new ScoreDataListener(scoreService))
             .sheet()
             .doRead();
}

// 自定义监听器(内存优化关键!)
public class ScoreDataListener extends AnalysisEventListener<ScoreData> {
    private static final int BATCH_COUNT = 300;
    private List<ScoreData> cachedList = new ArrayList<>(BATCH_COUNT);

    @Override
    public void invoke(ScoreData data, AnalysisContext context) {
        cachedList.add(data);
        if (cachedList.size() >= BATCH_COUNT) {
            saveData();
            cachedList.clear();
        }
    }
}

2. 动态查询(MyBatis Plus真香!)

java 复制代码
public Page<ScoreVO> queryScores(ScoreQuery query) {
    return scoreMapper.selectPage(new Page<>(query.getPage(), query.getSize()),
        new LambdaQueryWrapper<Score>()
            .eq(query.getStudentId() != null, Score::getStudentId, query.getStudentId())
            .eq(query.getCourseId() != null, Score::getCourseId, query.getCourseId())
            .likeRight(StringUtils.isNotBlank(query.getSemester()), Score::getSemester, query.getSemester())
            .orderByDesc(Score::getScore));
}

3. 成绩分析(SQL聚合妙用)

sql 复制代码
SELECT 
    c.course_name,
    AVG(s.score) AS avg_score,
    MAX(s.score) AS max_score,
    COUNT(CASE WHEN s.score < 60 THEN 1 END) AS fail_count
FROM score s
JOIN course c ON s.course_id = c.course_id
WHERE s.semester = '2023-2024-1'
GROUP BY c.course_id;

五、部署运行(避坑三连)

  1. MySQL时区配置(必看!)
properties 复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/score_db?serverTimezone=Asia/Shanghai&useSSL=false
  1. Flyway迁移脚本命名(格式不对全完蛋!)

    V1__init_database.sql
    V2__add_index.sql

  2. 启动参数设置(内存溢出退散!)

bash 复制代码
java -jar score-system.jar --spring.profiles.active=prod -Xmx512m -XX:MaxMetaspaceSize=256m

六、扩展方向(毕业设计可用)

  • 增加成绩预警模块(挂科风险预测)
  • 集成短信通知功能(考试成绩实时推送)
  • 开发可视化大屏(Echarts炫酷展示)
  • 实现多维度权限控制(Vue3+Spring Security)

七、总结(血泪经验)

开发过程中最容易翻车的三个点:

  1. Excel导入时日期格式处理(建议统一转时间戳)
  2. 成绩保留小数位问题(BigDecimal别用double!)
  3. 并发修改成绩时的乐观锁控制(@Version安排上)

建议大家在GitHub建立私有仓库(别问我怎么知道的),每次实现新功能前先创建新分支。这个项目完整代码我整理成了标准Maven工程,需要的同学可以评论区留言(看到必回)!

最后叮嘱:数据库记得每天自动备份!别等毕设答辩前夜数据丢失哭鼻子(别笑,真发生过)!

相关推荐
源码宝20 分钟前
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
java·大数据·源码·智慧工地·智能监测·智能施工
码不停蹄的玄黓1 小时前
JUC核心解析系列(五)——执行框架(Executor Framework)深度解析
java·jvm·spring boot·spring cloud
白总Server1 小时前
GaussDB 分布式数据库调优(架构到全链路优化)
java·网络·c++·架构·go·scala·数据库架构
listhi5201 小时前
k8s使用私有harbor镜像源
java·docker·kubernetes
慕木兮人可1 小时前
关于阿里云-云消息队列MQTT的连接和使用,以及SpringBoot的集成使用
spring boot·物联网·mqtt·阿里云·云计算
在未来等你1 小时前
Java并发编程实战 Day 21:分布式并发控制
java·多线程·并发编程
程序员小假1 小时前
你会不会使用 SpringBoot 整合 Flowable 快速实现工作流呢?
java·后端
来自外太空的鱼-张小张1 小时前
java将pdf文件转换为图片工具类
java·python·pdf
代码中の快捷键2 小时前
如何实现一个登录功能?
java·开发语言
保持学习ing2 小时前
微服务--消息队列mq
java·微服务·消息队列·rabbitmq·消息转换器