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

发布于:2025-05-21 ⋅ 阅读:(16) ⋅ 点赞:(0)

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

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

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

二、技术选型(2024新版)

// 技术栈配置(比传统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)

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)

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

@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批量导入(百万级数据不卡顿)

@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真香!)

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聚合妙用)

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时区配置(必看!)
spring.datasource.url=jdbc:mysql://localhost:3306/score_db?serverTimezone=Asia/Shanghai&useSSL=false
  1. Flyway迁移脚本命名(格式不对全完蛋!)
V1__init_database.sql
V2__add_index.sql
  1. 启动参数设置(内存溢出退散!)
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工程,需要的同学可以评论区留言(看到必回)!

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


网站公告

今日签到

点亮在社区的每一天
去签到