尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

数据库课程设计实战:学生选课系统的MySQL与JDBC全攻略

发布时间:2026/9/25 14:24:35

资讯中心
01
ARTICLE

数据库课程设计实战:学生选课系统的MySQL与JDBC全攻略

数据库课程设计实战:学生选课系统的MySQL与JDBC全攻略
简介面向数据库课程设计的学生选课信息管理系统完整项目资料采用Java语言与MySQL数据库实现客户端服务器架构适合计算机专业学生参考课程设计、期末项目或毕业设计。系统包含学生、教师、管理员三类用户角色学生端提供个人信息维护、课程查询、选课退课、成绩查询与成绩单打印、奖惩信息查看等功能教师端支持修改个人资料、查看所授课程、浏览选课学生名单并录入成绩管理员端则涵盖学生管理、教师管理、课程管理、选课管理、成绩管理、院系设置、奖惩信息管理及管理员操作等模块。资源包为rar压缩格式大小约一点九九兆字节内附完整源代码和设计报告数据库建表规范、表结构清晰有助于理解需求分析、模块划分、数据库设计以及客户端服务器交互流程。目前已有六千余人学习下载可直接借鉴系统架构和核心代码快速搭建可运行的学生选课信息管理系统。1. 数据库课程设计为什么都爱做学生选课系统先想清楚这套代码到底在练什么数据库课程设计一到答辩季十个项目里有六七个是学生选课管理系统。别觉得这题目太“基础”恰恰是这种看着人畜无害的系统最容易把数据库课设的雷踩全驱动类名抄错、中文乱码、连接超时、并发选课超卖。它真正训练的不是业务复杂度而是你对 MySQL 建表规范、JDBC 连接管理、事务边界和异常排查的综合手感同时还要产出一份和源码对得上的设计报告。这套 MySQLJava 组合适合两类人要交课程设计但不想自己从零踩坑的学生以及想快速重过一遍数据库基础的在职者。下面按我完整交付一版课设的路径拆解先定数据模型和设计报告骨架再把 Java 侧的事务与连接做对最后讲交付形态和答辩准备。2. 把数据模型定死在 MySQL 里三张表、外键与唯一约束的建表脚本2.1 为什么选课关系一定拆成三张表学生和课程是多对多关系一个学生选多门课一门课被多个学生选。概念模型里的多对多在关系模型里必须拆成两个一对多中间靠一张关联表连接。标准结构就是 student、course、elective 三张表elective 只存“谁在什么时间选了哪门课”这个事实。有些同学图省事在 student 表里加一个 course_ids VARCHAR(255)把选的课号用逗号拼进去。这种设计连第一范式都不满足而且答辩必被追问查询“某个学生选了几门课”要把字符串拆开再数统计“某门课有多少人选”没法直接用 SQL更做不了课程容量约束。三张表多付出的只是一条外键换来的是所有统计都能用 JOIN 完成已选人数直接 count elective 或累加 course.selected退课重选也不会产生语义混乱。从数据库理论角度这个设计满足第三范式字段都依赖主键、不存在传递依赖。设计报告“概念设计”部分第一张图就画这三张表标注“学生 1 : N 选课 N : 1 课程”。这一页画清楚后面逻辑设计和物理设计就顺了。2.2 建库建表脚本字段类型、引擎与字符集一次定对选课系统的地基是建表脚本我会直接把它放进设计报告的“物理设计”章节。先定字符集再定引擎避免中文乱码和外键问题两件事一起来。以下是完整脚本适用于 MySQL 5.7 与 8.0-- 学生选课信息管理系统建库脚本 CREATE DATABASE IF NOT EXISTS stu_course DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE stu_course; -- 学生表学号做业务主键不另设自增id CREATE TABLE student ( student_id CHAR(10) NOT NULL COMMENT 学号如2024000123, student_name VARCHAR(20) NOT NULL COMMENT 姓名, gender CHAR(1) DEFAULT 男, class_name VARCHAR(30) DEFAULT NULL, PRIMARY KEY (student_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生信息表; -- 课程表capacity 容量selected 已选人数 CREATE TABLE course ( course_id VARCHAR(10) NOT NULL, course_name VARCHAR(50) NOT NULL, credit DECIMAL(3,1) NOT NULL DEFAULT 2.0, capacity INT NOT NULL DEFAULT 60, selected INT NOT NULL DEFAULT 0, PRIMARY KEY (course_id), CONSTRAINT chk_selected CHECK (selected 0 AND selected capacity) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT课程信息表; -- 选课表中间表记录选课事实 CREATE TABLE elective ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, student_id CHAR(10) NOT NULL, course_id VARCHAR(10) NOT NULL, elective_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_student_course (student_id, course_id), CONSTRAINT fk_elective_student FOREIGN KEY (student_id) REFERENCES student (student_id), CONSTRAINT fk_elective_course FOREIGN KEY (course_id) REFERENCES course (course_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT选课记录表;脚本里几个参数容易被复制后乱改。student_id 用 CHAR(10) 而不是 INT因为学号是定长业务编号可能带前导零INT 会把这类编号搞丢。credit 用 DECIMAL(3,1) 保存 1.5 这种学分用 FLOAT 会在报表里出现 1.4999999 的脏数据。elective.id 是自增流水把 (student_id, course_id) 做成唯一键这是防止重复选课的数据库层兜底。所有表强制 ENGINEInnoDBMyISAM 不支持事务和外键课设涉及选课写入选错引擎后面必翻车。还有一个容易忽略的细节外键要求两个表的字段类型完全一致student_id 在 student 和 elective 里都必须是 CHAR(10)course_id 都必须是 VARCHAR(10)否则建表时报 “Foreign key constraint is incorrectly formed”。建完用 SHOW CREATE TABLE elective; 验证一次确认约束都在。2.3 唯一约束与外键把业务规则下沉到数据库这一版脚本里最重要的不是 CRUD 能跑而是两个约束。第一个是 UNIQUE KEY uk_student_course (student_id, course_id)。如果 Java 代码先查“是否已选过”再插入两个并发请求可能同时通过检查最后靠这一条唯一约束兜底其中一条插入因为 Duplicate entry 失败这反而保护了业务数据。把这条规则写在表上等于给业务逻辑加了一道保险。第二个是外键。fk_elective_student 和 fk_elective_course 默认是 RESTRICT 行为删除学生或课程时如果还有选课记录MySQL 会拒绝删除。课设里这个行为不用改报告里写明“用 RESTRICT 是为了保留历史选课记录”比改成 ON DELETE CASCADE 更符合真实教务场景。先建学生和课程表再建选课表顺序反了会因引用表不存在报错。另外很多课设喜欢往学生表里加 password 字段但这不属于选课系统核心需求。报告功能列表只写了选课和退课就别堆无关字段字段越少答辩要解释的边界越少。这一层立住了Java 代码才敢往上写。2.4 设计报告怎么写需求分析到物理设计的五个板块设计报告的骨架通常固定为五个板块需求分析、概念设计、逻辑设计、物理设计、实现与测试。板块内容要点对应产出需求分析系统角色、功能需求、数据需求学生选课、退课、查询课表概念设计ER 图、实体与联系学生、课程、选课三实体逻辑设计关系模式、函数依赖三张表的字段设计物理设计存储引擎、字符集、索引策略InnoDB、utf8mb4、唯一索引实现与测试核心模块代码、测试用例Java 代码与测试用例表写报告最怕从网盘抄一份和自己代码对不上的模板。老师随手一指某个表名问设计理由答不上来就是诚信问题。我习惯把 2.2 的建表脚本完整放进“数据库设计”一章正文对每个关键字段写两行选型理由。ER 图用 MySQL Workbench 连上库反向生成再手工调整关系连线比自己从零画准得多。报告和源码保持同名对应老师复查时不会出现“报告里三张表代码里五张表”的尴尬。3. Java 侧连接与事务从裸 JDBC 到 HikariCP 的选课写入路径3.1 裸 JDBC 为什么课设能跑但答辩会被追问课程设计最低配的写法是每次操作都 Class.forName(com.mysql.cj.jdbc.Driver)再 DriverManager.getConnection用完 conn.close()。这套代码能跑但答辩老师追问一句“你的系统并发选课 30 人时MySQL 上有多少个连接”就会暴露问题每次请求都是一次 TCP 握手加 MySQL 认证开销不小一旦某个分支忘了 close连接就会占满 MySQL 的 max_connections报 Too many connections。所以哪怕课设只做控制台版也要知道连接管理的三种层次DriverManager 直连、自己维护连接集合、HikariCP 连接池。三者的差别在报告里写成一段比写多少 CRUD 都加分。数据库连接池这个点也是 java 面试题里的高频项带着理解写完课设后面求职复习都省力。3.2 用 HikariCP 接管 MySQL 连接最小配置与参数说明课设规模不大直接上 HikariCP 是常见做法。Maven 工程在 pom.xml 加两个依赖mysql-connector-j 和 HikariCP。示例用的是 8.x 驱动与 HikariCP 5.xMaven 仓库都能拉到dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version8.0.33/version /dependency dependency groupIdcom.zaxxer/groupId artifactIdHikariCP/artifactId version5.0.1/version /dependency连接配置集中在一个类里static 块初始化一次整个程序共享一个数据源package com.example.course.config; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; public class DbPool { private static final HikariDataSource DATA_SOURCE; static { HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/stu_course?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8); config.setUsername(root); config.setPassword(你的密码); config.setDriverClassName(com.mysql.cj.jdbc.Driver); config.setMaximumPoolSize(10); // 课设并发不大10 个连接足够 config.setMinimumIdle(2); // 空闲时保留 2 个连接 config.setConnectionTimeout(3000); // 3 秒拿不到连接直接失败 config.setMaxLifetime(600000); // 连接最长存活 10 分钟 DATA_SOURCE new HikariDataSource(config); } public static java.sql.Connection getConnection() throws java.sql.SQLException { return DATA_SOURCE.getConnection(); } }参数不能照抄网上的“大池子配置”。课设就 10 个连接maximumPoolSize 不要开 50每个连接都占 MySQL 端内存。connectionTimeout 设 3000ms 是为了快速失败默认 30 秒会让界面像卡死。maxLifetime 一定要比 MySQL 的 wait_timeout 短MySQL 默认 8 小时关掉空闲连接如果池里还留着旧连接下一次请求就会报 Communications link failure。连接串里的 serverTimezoneAsia/Shanghai 是 MySQL 8.0 必需的不写会报时区错误characterEncodingutf8 管住中文具体见第 5 章。3.3 选课事务边界先扣容量再写记录两条 SQL 不能拆开选课核心动作表面是一条 INSERT实际必须两件事同时成功课程余量减 1选课记录加 1。早期的实现是先 SELECT 出 capacity 和 selected在 Java 里比较再 UPDATE、INSERT。后来被一个并发问题问住两个请求同时读到余量 1各自都认为能选结果选进去两个人。这就是“先查后写”的经典竞态。正确做法是把容量判断下推到 UPDATE 的 WHERE 条件里让数据库自己决定这条更新成不成立public boolean enroll(String studentId, String courseId) { String updateSql UPDATE course SET selected selected 1 WHERE course_id ? AND selected capacity; String insertSql INSERT INTO elective (student_id, course_id) VALUES (?, ?); try (Connection conn DbPool.getConnection()) { // 关闭自动提交两条 SQL 才是一个原子操作 conn.setAutoCommit(false); try (PreparedStatement psUpdate conn.prepareStatement(updateSql); PreparedStatement psInsert conn.prepareStatement(insertSql)) { psUpdate.setString(1, courseId); if (psUpdate.executeUpdate() 0) { conn.rollback(); // 课程已满回滚 return false; } psInsert.setString(1, studentId); psInsert.setString(2, courseId); psInsert.executeUpdate(); conn.commit(); return true; } catch (Exception e) { conn.rollback(); throw new RuntimeException(选课失败已回滚, e); } finally { conn.setAutoCommit(true); // 连接还回池子前必须复位 } } catch (SQLException e) { throw new RuntimeException(获取数据库连接失败, e); } }代码里先关自动提交两条 SQL 才算一个整体。UPDATE 影响行数为 0说明课程已满事务回滚不会残留任何中间状态。psInsert 如果再撞上唯一约束也会被抓进 catch 回滚把重复选课的脏数据挡在数据库层。finally 里的 setAutoCommit(true) 很容易漏连接还给 HikariCP 后会被复用如果一直带着 false下一个请求拿到连接后 commit 不生效这种黑匣子问题排查起来很费时间。提示course 表里的 selected 冗余字段正是为了 UPDATE 时能原子扣减而加的。如果不加只能用 SELECT COUNT(*) 先算出已选人数再比较又回到了“先查后写”的老路。这个“冗余字段换原子操作”的理由设计报告里主动写出来很加分。退课是镜像操作DELETE 选课记录成功后再 UPDATE selected selected - 1同样在一个事务里。检查 DELETE 影响行数为 0 时说明没选过这门课返回提示不要让已选人数减成负数。3.4 PreparedStatement 防注入拼接 SQL 在答辩现场会翻车如果系统里有“按课程名查课程”的功能有人图省事写 LIKE % keyword %把输入直接拼进 SQL。用户在输入框填一个 1 OR 11查询条件就变成恒真把整张课程表拖出来更狠的写法可以直接 DROP TABLE。这是数据库课程设计里最容易被老师当场演示攻击的一点。正确写法是把所有用户输入都经占位符交给 PreparedStatementString sql SELECT * FROM course WHERE course_name LIKE ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, % keyword %);参数和 SQL 结构是分两条通道到服务端的驱动会转义参数里的单引号和反引号MySQL 服务端不会把参数重新解释成 SQL 指令。答辩被问“怎么防注入”时直接打开代码指 setString()然后补这一句比背“预编译”三个字有说服力。写代码时统一使用 PreparedStatement所有字符串拼接的 SQL 都视为不合格这条规矩写进报告“代码规范”一节。4. 控制台还是 JavaWeb两种交付形态的取舍与报告写法4.1 两种形态的取舍开发量、答辩风险与评分预期课程设计交付形态一般两类。控制台版Main 里打印菜单Scanner 读输入终端交互。JavaWeb 版Servlet JSP 或 Spring Boot浏览器里点按钮选课。两者共享第 3 章的 DAO 和 Service 代码差别只在最外层交互。还要注意控制台版在报告里表述为“单机演示版”Web 版表述为“B/S 架构版”标题用词和代码形态要一致。最稳的选择策略是看课程要求报告只要求功能控制台版足够老师明确说“要有界面”再上 Web 版。不要一开始就上 Spring Boot 全家桶课设周期最忌讳把时间烧在环境配置上。下面这个对比表可以放进报告“开发环境与运行方式”一节对比项控制台版Servlet JSP 版新增工作量一个 Main 类Servlet、JSP、部署配置调试方式直接跑 main部署 Tomcat 看日志答辩风险功能演示不够直观请求链路和编码问题多加分点事务、连接池讲清楚页面演示观感好如果两个版本都做过报告中写“控制台版用于核心逻辑验证Web 版是对外呈现”这是很自然的演进说明。4.2 控制台版的最小骨架实体-DAO-Service 三层控制台版最推荐的分层是 entity / dao / service / Main。entity 是 Student、Course 的简单 POJOdao 只负责拼 SQL 和执行service 管事务与业务判断Main 只做菜单循环和输入读取。public class Main { public static void main(String[] args) { CourseService service new CourseService(); try (Scanner scanner new Scanner(System.in)) { while (true) { System.out.println(1.选课 2.退课 3.查询课表 0.退出); int choice scanner.nextInt(); if (choice 0) { break; } System.out.print(学号); String studentId scanner.next(); System.out.print(课程号); String courseId scanner.next(); if (choice 1) { boolean ok service.enroll(studentId, courseId); System.out.println(ok ? 选课成功 : 选课失败课程已满或已选过); } else if (choice 2) { boolean ok service.drop(studentId, courseId); System.out.println(ok ? 退课成功 : 退课失败未选该课程); } } } } }service.enroll() 就是第 3.3 节那个方法这里没有 SQL、没有 Connection全部被 dao 包在底下。Main 里的 Scanner 只是临时交互手段将来要换成 Servlet只需要把“读取参数然后调 service”这段平移过去。实体类字段和表字段保持同名类型对应也要准确CHAR/VARCHAR 对应 StringDECIMAL 对应 BigDecimalDATETIME 对应 LocalDateTime不要在实体里用 float 接 credit后续 SQL 里比较学分时会遇到精度问题。4.3 升级到 Servlet一个选课请求从 doPost 到 JDBC 的完整路径做 Web 版时最少要有一个选课入口。前端表单 methodpost action/enroll提交两个参数后台 Servlet 取出来调 serviceWebServlet(/enroll) public class EnrollServlet extends HttpServlet { private final CourseService service new CourseService(); Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // 必须放在第一次 getParameter 之前 request.setCharacterEncoding(UTF-8); String studentId request.getParameter(studentId); String courseId request.getParameter(courseId); boolean ok service.enroll(studentId, courseId); response.setContentType(text/html;charsetUTF-8); response.getWriter().write(ok ? 选课成功 : 选课失败); } }setCharacterEncoding 必须放在第一次 getParameter 之前否则中文参数会乱。Servlet 里没有任何业务判断只做“取参-调用-输出”三件事事务在 service.enroll() 里。这条调用链 Servlet - Service - DAO - MySQL 与报告里的功能模块图一致答辩现场让画请求路径时按这条链讲就能自洽。Web 版还可以加一个 Filter 统一设置请求和响应编码这样每个 Servlet 就不用重复写三行 setCharacterEncoding报告里写成“编码过滤器”也算一个独立模块。还要注意Web 容器拿到的 Connection 来自 HikariCP请求结束连接归还池Servlet 自己不要调用 conn.close()否则 Service 返回后连接已关闭DAO 再取会拿到空连接。4.4 报告里的功能模块图和流程图怎么和代码对上设计报告通常需要功能模块图和业务流程图。功能模块图按“表现层 / 业务层 / 数据层”三层画每个方块对应真实类名EnrollServlet 归表现层CourseService 归业务层JdbcCourseDao 归数据层。业务流程图画选课接收学号课程号 - 事务开始 - 更新余量 - 插入选课记录 - 提交异常走回滚。两张图不要求美术水准要求每个框的名字能在代码里搜到。常见扣分项是报告里叫“选课管理模块”代码里却有 CourseService、ElectiveDao、EnrollAction 三种叫法老师当场会怀疑报告和源码不是同一次交付。图中加上数据库图标把三张表的表名标在旁边就是完整的“图-表-码”三对照。课设报告最值钱的地方不是页数而是这种能复查的一致性。5. 数据库课设避坑指南驱动报错、中文乱码与连接失败的排查记录这一节直接记录五条高频报错每条按“现象 - 原因 - 解决”三层写。整体排查顺序有个经验先确认 MySQL 服务在跑再确认库和表建对然后看 Java 侧连接串最后才怀疑事务逻辑。前三步解决了课设排障的七成问题而且多数不是代码 bug。提示排障顺序记忆口诀服务先行、库表其次、连接串再次、SQL 最后。很多报错是环境问题而不是代码问题先分清楚这两类能省下一整天。5.1 驱动类找不到ClassNotFoundException 的三种原因现象程序启动即报 java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver或者 Class.forName 抛异常。原因驱动 jar 没进 classpathMySQL 5.x 时代的类名 com.mysql.jdbc.Driver 被抄进 8.x 工程IDE 里 Maven 依赖与部署环境不一致。解决先确认 pom.xml 或 lib 目录里有 mysql-connector-j再看类名是否多了一段 cj。8.x 驱动的完整类名是 com.mysql.cj.jdbc.Driver5.x 是 com.mysql.jdbc.Driver这是 MySQL 升级后最常见的坑。Maven 工程用 mvn dependency:tree 确认依赖真正解析IDE 则检查 Run Configuration 的 classpath。单独写一行 Class.forName(com.mysql.cj.jdbc.Driver) 做冒烟测试能过说明依赖没问题继续往下查。5.2 Unknown database连接 URL 里的库名对不上现象java.sql.SQLException: Unknown database stu_course但同学说明明建过库。原因建库脚本没真正执行或连接串里库名大小写不一致。MySQL 在 Linux 上对库名大小写敏感Stu_Course 和 stu_course 是两个名字。解决命令行 mysql -u root -p 登进去SHOW DATABASES; 确认实际库名再看 DbPool 里 jdbcUrl 的路径段是否一致。如果库不在回头把第 2.2 节脚本一段段执行不要一次性粘贴第几条报错能直接定位。如果本机装了多个 MySQL 实例还要确认 3306 端口连的是哪个实例端口连错同样会报 Unknown database 或 Access denied。5.3 存中文全是问号连接串缺了 characterEncoding现象Java 写入的中文在 MySQL 里变成 ???或控制台输出乱码但用 Navicat 手工建的表没问题。原因字符集问题常出现在四个层面服务端、库、表、连接。Java 程序通过 JDBC 往 MySQL 写中文时连接层默认字符集可能是 latin1服务端认为客户端发来的是 latin1存出来就是问号。解决JDBC URL 连接串固定带 characterEncodingutf8MySQL 8.0 下驱动会映射为 utf8mb4库、表在建表脚本里指定 utf8mb4三层都对齐后重启程序测试。还有一处容易被忽略控制台程序 System.out 的输出编码取决于 IDE 和终端Windows 下终端默认 GBK输出乱码不代表库里真的存坏了用数据库客户端查一遍再判断。5.4 Cant connect through socketMySQL 服务没有起来现象程序报 Communications link failure命令行也进不去报 ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/run/mysqld/mysqld.sock。原因MySQL 服务没启动或本地连接走了 socket 而 socket 路径不一致。这通常发生在 Linux 环境也常见于 Windows 上 MySQL 服务被停用Java 代码本身是无辜的。解决先起来服务再谈代码。Linux 上 systemctl status mysql 或 service mysql statusWindows 在“服务”窗口找 MySQL80 启动这些在 mysql 安装教程里都有这里不展开。服务已启动仍报 socket 错误时改用 TCP 方式绕过 socketmysql -h 127.0.0.1 -P 3306 -u root -p 试连接JDBC URL 里也用 127.0.0.1 而不是 localhost。按这个顺序排查十分钟能定位别一上来就怀疑自己的连接串写错。5.5 选课人数超过容量事务没包住两条 SQL现象课程容量 60最终 elective 表出现 61 条记录或页面提示选课成功但余量变成负数。原因代码先 SELECT 查余量再 INSERT 选课记录两步之间没有事务保护。两个请求同时读到余量 1都进入插入分支就超卖了。更新余量与插入记录没放同一事务插入成功但更新失败时也会留下脏数据。解决第 3.3 节已经给出正确写法UPDATE course SET selected selected 1 WHERE course_id ? AND selected capacity再 INSERT elective两条 SQL 由同一事务包住。验证方法是写一个多线程测试类开 10 个线程对容量 5 的同一门课同时选课最终 elective 里只能有 5 条记录其余线程要么影响行数为 0要么撞唯一约束。这个测试用例写进报告测试章节比截图有说服力。6. 把课设做到能答辩数据字典、测试用例与演示顺序6.1 数据字典建表脚本反推出来的交付物报告附录放数据字典表每张表一张字段名、类型、约束、说明四列。直接从第 2.2 节的 CREATE TABLE 抄下来整理就行。字段说明不要只写“学号”要写“定长编号保留前导零CHAR(10) 避免 INT 丢前缀”这类设计理由。三张表各出一张老师问到任何一个字段都能翻到对应说明。这一页不需要额外工具建表脚本本身就是数据字典的源数据。6.2 测试用例与演示顺序先主流程后边界演示顺序建议登录或进入菜单 - 查询课程列表 - 选课成功 - 重复选课被拒 - 退课成功 - 余量变化。边界用例放后面选已满课程失败、选不存在的学号触发外键报错、并发选课不超卖。每一条对应报告测试章节的一行记录演示时照这个顺序走不会中途卡壳。测试用例表至少列八条覆盖正常流、异常流和并发场景比贴十张界面截图更让老师觉得你做了验证。6.3 答辩追问的应对事务、外键、池参数答辩被问概率最高的三个问题为什么选课要开事务三张表为什么不能合成两张连接池参数怎么定的。答案全在第 3 章和第 5 章的代码里不需要背概念打开代码指 WHERE selected capacity 和 conn.setAutoCommit(false) 就能讲清。这些内容也常出现在 java 面试题数据库部分课设做完顺手把答案整理成笔记后面复习直接受益。我的教训是答辩前一天把这三个问题写在一张纸上贴在屏幕边对着代码讲两遍比背报告管用。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。