0

0

在Java里如何设计一个学生选课系统_Java多表数据库设计与查询解析

P粉602998670

P粉602998670

发布时间:2026-03-18 15:16:31

|

895人浏览过

|

来源于php中文网

原创

选课表必须用(student_id, course_id)联合主键并设唯一约束,配外键级联删除;查学生及课程需三表LEFT JOIN+collection映射;增删操作应基于Selection实体,避免双向集合引用。

在java里如何设计一个学生选课系统_java多表数据库设计与查询解析

学生、课程、选课三张表怎么建才不翻车

外键约束和联合主键是核心。学生表 student 和课程表 course 各自用 id 当主键;选课表 selection 必须用 (student_id, course_id) 作联合主键,否则同一学生重复选同一门课就拦不住。

常见错误是把 selection.id 单独设成自增主键——这会让数据冗余且业务语义丢失。另外,student_idcourse_id 都要加外键,并配 ON DELETE CASCADE(比如学生退学,他所有选课记录自动清除)。

字段设计上,selection 表建议加 selected_at TIMESTAMP 记录时间,方便后续查“最早选哪门课”或做选课时段统计。

MyBatis里怎么写一对多查学生+所选课程

不能只靠 resultMap 嵌套查询就完事。学生表和选课表是多对多关系,中间隔着 selection,所以一次查出学生及其课程,得用三表联查 + 手动组装,或者分两步:先查学生,再用 student_id 批量查 selectioncourse

立即学习Java免费学习笔记(深入)”;

推荐用联查,SQL 示例:

SELECT s.id, s.name, c.id AS cid, c.title
FROM student s
LEFT JOIN selection sel ON s.id = sel.student_id
LEFT JOIN course c ON sel.course_id = c.id
WHERE s.id = #{id}

注意点:

  • LEFT JOIN 保证没选课的学生也能查出来(c.idc.titleNULL
  • MyBatis 的 resultMap 要用 collection 映射课程列表,且 ofType 指向课程实体类
  • 别忘了给 c.id 起别名(如 cid),否则和学生 id 冲突,MyBatis 会覆盖

插入选课记录时怎么防重复和超限

数据库层必须加唯一约束:UNIQUE (student_id, course_id),这是最后一道防线。应用层还要做两件事:检查课程是否已满、检查学生是否已选过。

百灵大模型
百灵大模型

蚂蚁集团自研的多模态AI大模型系列

下载

典型流程:

  • selection 表是否存在 (student_id, course_id) 记录 → 防重复
  • 查该课程在 selection 中的当前人数,对比课程表 course.max_capacity 字段 → 防超限
  • 两个检查必须在同一个事务里完成,否则并发时可能两人同时通过检查,然后都插入成功

别依赖前端校验,也别只靠 Java 层 if 判断——高并发下必然出错。

Java实体类怎么映射多对多关系才不绕晕

学生类 Student 不该直接持有 List<Course>,而应持有 List<Selection>,再通过 Selection 关联到 Course。这样更贴近数据库结构,也避免循环引用和 JSON 序列化炸掉。

示例结构:

class Student { private Long id; private String name; private List<Selection> selections; }
class Selection { private Long studentId; private Long courseId; private LocalDateTime selectedAt; }
class Course { private Long id; private String title; private Integer maxCapacity; }

好处是:

  • 增删选课只需操作 Selection 实体,不用改 StudentCourse
  • 查某学生第几轮选的课、选课时间等扩展字段,天然有落脚点
  • 避免 StudentCourse 双向持有对方集合,导致 Hibernate 的 LazyInitializationException 或 Jackson 的 StackOverflowError

真正麻烦的是查询场景的灵活组合——比如“查所有未满员的课程,且排除该学生已选的”。这种逻辑写 SQL 更稳,别硬套 ORM 的链式调用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

468

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

315

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

32

2025.10.24

mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

305

2023.08.21

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

94

2024.02.23

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

107

2024.02.23

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

162

2024.02.23

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

159

2024.02.23

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

7

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.6万人学习

Java 教程
Java 教程

共578课时 | 84.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号