简介:面向Java课程设计的宿舍管理系统完整项目包,适合正在完成GUI开发作业或想学习JDBC连接SQL Server的在校生与初学者。系统功能覆盖住宿学生信息维护、宿舍信息管理、报修处理及离返校记录查询,前台基于Java Swing构建,数据库连接与操作集中在DataBaseConnection类,便于二次修改。压缩包共64个文件,含10个Java源文件、34个class编译文件、SQL Server建库脚本、2个Jar依赖、10张运行截图及实验报告、PPT,整体仅2.7MB,结构简洁。已有1523人学习,资源附带“使用必看”说明与数据库课程设计报告,读者可快速部署项目、掌握Swing界面与JDBC的整合方式,并用于课程答辩演示。
1. 课程设计选型:为什么宿舍管理系统还在用 Java Swing
很多同学拿到课程设计任务,第一反应是想用 Spring Boot + Vue 搞个前后端分离,结果被老师一句「我们验收只看 Java 桌面程序」打回。这里说的「基于 Java swing 带 GUI 界面的宿舍管理系统」就是课程设计里最典型的选题:技术栈固定为 Java Swing + JDBC + MySQL,交付物是源码、数据库脚本、课程设计报告和演示 PPT。这个项目难度适中,但正因为门槛低,老师会把重点放在数据库设计规不规范、CRUD 完不完整、界面事件健不健壮、报告能不能讲清楚。做过这个项目,等于把 Java 基础、JDBC、集合、事件监听这些课设必考知识点全部串了一遍,性价比很高。
2. 搭建开发环境与项目骨架:JDK 8 + MySQL 5.7 的最小组合
2.1 版本选型:JDK 8 最稳,驱动类名是个分水岭
我一般会在这个项目上固定使用 JDK 8。原因不是更高版本不行,而是答辩机器常常是实验室的老系统,装的是 JDK 8;你要是用 JDK 17 写 JFrame 代码,大概率也能跑,但万一对方机器只有一个 JRE 8,你编译出来的 class 文件直接报 UnsupportedClassVersionError,开场即翻车。Swing 从 JDK 9 开始没有破坏性变化,课设代码也不涉及模块化,JDK 8 是风险最低的选择。
MySQL 版本我推荐 5.7。如果你自己电脑装的是 8.0,也完全能用,关键是驱动 jar 要匹配:5.x 系列的驱动类名是com.mysql.jdbc.Driver,8.0 以后变成了com.mysql.cj.jdbc.Driver。很多同学把 8.0 的驱动 jar 拷进项目,代码还写旧类名,一启动就报 ClassNotFoundException。
为什么不在这个项目里引入 Maven?课程设计交付的是完整工程文件夹,老师拿到后要能直接打开运行。Maven 项目在没配好镜像源的机器上要下载半天依赖,演示现场最容易卡壳。更稳的做法是用 IDE 新建普通 Java 项目,把 mysql-connector-java-5.1.49.jar 放到项目根目录下的 lib 文件夹,然后 Add to Build Path,提交时把整个目录一起交。
2.2 工程目录规划与 DBHelper 工具类
先规划目录,后面所有代码都按这个结构放,报告里也好写「分层设计」:
DormManager/ ├── src/ │ ├── com/dorm/MainApp.java # 程序入口 │ ├── com/dorm/util/DBHelper.java # JDBC 工具类 │ ├── com/dorm/dao/ # DAO 层,放 SQL 操作 │ │ ├── AdminDao.java │ │ ├── StudentDao.java │ │ ├── DormDao.java │ │ └── RepairDao.java │ ├── com/dorm/ui/ # Swing 界面层 │ │ ├── LoginFrame.java │ │ ├── MainFrame.java │ │ ├── StudentPanel.java │ │ └── DormPanel.java │ └── com/dorm/model/ # 实体类 │ ├── Student.java │ ├── Dorm.java │ └── Admin.java ├── lib/ │ └── mysql-connector-java-5.1.49.jar ├── sql/ │ └── dorm.sql └── README.txtmodel 层放实体类,dao 层放 JDBC 操作,ui 层只做界面展示。这个分层写进课程设计报告,就是「三层结构设计」,也方便后续把连接管理替换成连接池。如果进度有富余,可以在 DAO 层用 DBCP 或 HikariCP 替换DriverManager.getConnection,这是报告里能写的「连接池优化」亮点,但课设里直接用 DBHelper 静态方法已经足够。
数据库连接工具类是整个程序的地基:
package com.dorm.util; import java.sql.*; public class DBHelper { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/dorm" + "?useUnicode=true&characterEncoding=utf8" + "&useSSL=false&serverTimezone=Asia/Shanghai"; private static final String USER = "root"; private static final String PASSWORD = "123456"; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(Connection conn, Statement st, ResultSet rs) { try { if (rs != null) rs.close(); } catch (SQLException ignored) {} try { if (st != null) st.close(); } catch (SQLException ignored) {} try { if (conn != null) conn.close(); } catch (SQLException ignored) {} } }URL 里三个参数是课设最容易漏的。useUnicode=true和characterEncoding=utf8是中文写入数据库不乱码的前提;useSSL=false是为了省去 MySQL 8.0 在本地环境的 SSL 握手警告;serverTimezone=Asia/Shanghai是 8.0 驱动的要求,5.1 驱动加不加都不报错,统一写上更省心。USER 和 PASSWORD 按你自己本机改,如果记不清密码,ini 文件里找一下,或者干脆重装 MySQL 把密码设成 123456,课设阶段用默认密码最省时间。
2.3 主窗体骨架:CardLayout 管理页面切换
登录成功之后进入主窗体。我习惯用一个 JFrame + 左侧 JButton 菜单 + 右侧 CardLayout 容器,每个功能面板独立成一个 JPanel,互不干扰。
package com.dorm.ui; import javax.swing.*; import java.awt.*; public class MainFrame extends JFrame { private JPanel cardPanel; private CardLayout cardLayout; public MainFrame() { setTitle("宿舍管理系统"); setSize(1000, 650); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); cardLayout = new CardLayout(); cardPanel = new JPanel(cardLayout); cardPanel.add(new StudentPanel(), "student"); cardPanel.add(new DormPanel(), "dorm"); cardPanel.add(new RepairPanel(), "repair"); JPanel leftMenu = new JPanel(new GridLayout(0, 1)); JButton btnStudent = new JButton("学生管理"); JButton btnDorm = new JButton("宿舍管理"); JButton btnRepair = new JButton("报修管理"); btnStudent.addActionListener(e -> cardLayout.show(cardPanel, "student")); btnDorm.addActionListener(e -> cardLayout.show(cardPanel, "dorm")); btnRepair.addActionListener(e -> cardLayout.show(cardPanel, "repair")); leftMenu.add(btnStudent); leftMenu.add(btnDorm); leftMenu.add(btnRepair); add(leftMenu, BorderLayout.WEST); add(cardPanel, BorderLayout.CENTER); } }CardLayout 的 key 就是 add 方法里的第二个字符串,show(cardPanel, "student")时必须完全一致,否则会静默地什么都不切换,这是新手容易盯半天找不出来的问题。EXIT_ON_CLOSE放在主窗体,登录窗口已经 dispose,进程能干净退出。左侧菜单用GridLayout(0, 1)表示一列多行,按钮会垂直均匀分布,比手动设坐标省事得多。
3. 数据库设计:五张核心表与 ER 关系怎么定
3.1 需求拆解与五张表的结构
宿舍管理系统本质是「人、房、记录」三类对象的组合。人包括管理员和学生,房是宿舍,记录包括入住历史、报修。不要一上来建十几张表,课设评审时间只有几分钟,五张表把主流程讲清楚就够了:
| 表名 | 职责 |
|---|---|
| admin | 管理员账号,登录用 |
| dorm | 宿舍基础信息,楼栋、房间、容量 |
| student | 学生基本信息,含当前宿舍和床号 |
| check_in | 入住/换宿/退宿流水,保留历史 |
| repair | 报修工单,记录内容和状态 |
admin 表只做登录认证,字段够用就行。student 表的dorm_id是逻辑外键,指向 dorm 表的主键,bed_no表示床号。check_in 表是典型的流水表,每次入住插一行,退宿时把 status 改成 0,这样能保留入住历史,报告里可以写「支持换宿追踪」。repair 表存报修内容、上报人、联系电话、处理状态。这五张表的主线是:管理员登录,维护学生和宿舍,给学生分配宿舍形成入住记录,宿舍出问题生成报修单。
3.2 建库建表 SQL:字符集与索引一次配好
CREATE DATABASE IF NOT EXISTS dorm DEFAULT CHARACTER SET utf8mb4; USE dorm; CREATE TABLE admin ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(30) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL, real_name VARCHAR(30) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE dorm ( id INT PRIMARY KEY AUTO_INCREMENT, building VARCHAR(20) NOT NULL, room_no VARCHAR(20) NOT NULL, capacity INT NOT NULL DEFAULT 4, gender TINYINT NOT NULL DEFAULT 1, UNIQUE KEY uk_building_room (building, room_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, stu_no VARCHAR(20) NOT NULL UNIQUE, name VARCHAR(30) NOT NULL, gender TINYINT NOT NULL, major VARCHAR(50), phone VARCHAR(20), dorm_id INT, bed_no INT, KEY idx_dorm (dorm_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE check_in ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, dorm_id INT NOT NULL, bed_no INT NOT NULL, checkin_date DATE NOT NULL, status TINYINT NOT NULL DEFAULT 1, KEY idx_student (student_id), KEY idx_dorm (dorm_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE repair ( id INT PRIMARY KEY AUTO_INCREMENT, dorm_id INT NOT NULL, content VARCHAR(255) NOT NULL, reporter VARCHAR(30) NOT NULL, phone VARCHAR(20), create_time DATETIME DEFAULT CURRENT_TIMESTAMP, status TINYINT NOT NULL DEFAULT 0, KEY idx_dorm (dorm_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO admin (username, password, real_name) VALUES ('admin', '123456', '系统管理员');建表脚本最后别忘了插入一条默认管理员账号,否则登录界面永远进不去。密码我这里先放明文,正确做法是存 MD5 或 SHA-256,但课程设计里老师经常要现场打开数据库看密码,明文还原度高一点。真正要提交报告时,在报告里补一句「生产环境应加密存储」,这句话在答辩时很加分。
性别用 TINYINT,1 代表男,0 代表女,不要直接存字符串。排序、统计、切换筛选都比字符串快,界面层再映射成「男/女」。capacity 默认 4,对应四人间。UNIQUE KEY uk_building_room (building, room_no)防止同一栋楼出现两个相同房号,这是数据规范性的体现。
3.3 外键用不用:课设里的「逻辑外键」
很多课程设计模板会在建表语句里直接写 FOREIGN KEY,但我做这个项目时建议不建物理外键。原因有两个:一是 Swing 的删除操作经常需要先删子表再删父表,物理外键会在演示时不断弹约束异常,老师会觉得你代码不稳;二是课设数据量小,物理外键的约束优势体现不出来。
正确做法是在 ER 图上把这些字段标成逻辑外键,用虚线连接,然后在 DAO 层用一条 SQL 做关联查询。报告里写「为保证数据一致性,对关键字段做逻辑关联,并在应用层二次校验」。索引只需要加在查询频繁的字段上:student 表的stu_no一进系统就要按学号查,dorm 表按(building, room_no)建联合唯一索引,check_in 表的student_id、dorm_id加普通索引。不要给 gender、status 这类低区分度字段加索引,区分度太低,MySQL 优化器根本不会走这个索引。
4. 用 Swing 写 GUI:登录界面、主窗体与增删改查的代码骨架
4.1 登录界面:JFrame + JPasswordField 与防注入
登录界面是第一个展示给老师的,也是最容易挑刺的地方。用 JFrame 而不是 JDialog,启动类直接 new LoginFrame() 更直观。密码框用 JPasswordField,取密码时用getPassword()返回 char[],不要用getText(),这是安全习惯。
package com.dorm.ui; import com.dorm.util.DBHelper; import javax.swing.*; import java.awt.*; import java.sql.*; public class LoginFrame extends JFrame { private JTextField tfUser = new JTextField(15); private JPasswordField pfPwd = new JPasswordField(15); public LoginFrame() { setTitle("宿舍管理系统登录"); setSize(360, 220); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); JPanel panel = new JPanel(new GridBagLayout()); panel.add(new JLabel("用户名:")); panel.add(tfUser); panel.add(new JLabel("密码:")); panel.add(pfPwd); JButton btn = new JButton("登录"); panel.add(btn); btn.addActionListener(e -> doLogin()); add(panel); } private void doLogin() { String user = tfUser.getText().trim(); String pwd = new String(pfPwd.getPassword()); if (user.isEmpty() || pwd.isEmpty()) { JOptionPane.showMessageDialog(this, "用户名和密码不能为空"); return; } String sql = "SELECT id FROM admin WHERE username=? AND password=?"; try (Connection conn = DBHelper.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, user); ps.setString(2, pwd); ResultSet rs = ps.executeQuery(); if (rs.next()) { new MainFrame().setVisible(true); dispose(); } else { JOptionPane.showMessageDialog(this, "用户名或密码错误"); } } catch (SQLException ex) { JOptionPane.showMessageDialog(this, "数据库异常:" + ex.getMessage()); } } }try-with-resources 是 JDK 7 以后的标准写法,会自动关闭 Connection 和 PreparedStatement,报告里可以写「使用 try-with-resources 规范管理数据库资源」。ps.setString(1, user)的参数下标从 1 开始,不要写 0。这里最忌讳拼字符串 SQL,老师现场会在密码框里输入一个' OR '1'='1,拼 SQL 的话直接就被穿库了,用占位符是底线。
4.2 学生管理面板:JTable 加载与增删改查
学生管理是整个系统最核心的页面。JTable 本身不存数据,数据放在 TableModel 里。所以「增删改查」里的查,本质是查完数据库后调table.setModel重新灌数据。下面这段是加载数据的方法,也是所有列表页的模板:
package com.dorm.ui; import com.dorm.util.DBHelper; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.sql.*; public class StudentPanel extends JPanel { private JTable table = new JTable(); private DefaultTableModel model; private JTextField tfSearch = new JTextField(10); public StudentPanel() { setLayout(new BorderLayout()); model = new DefaultTableModel( new String[]{"学号", "姓名", "性别", "专业", "宿舍号", "床号"}, 0); table.setModel(model); JScrollPane scroll = new JScrollPane(table); JPanel top = new JPanel(); top.add(tfSearch); JButton btnSearch = new JButton("查询"); btnSearch.addActionListener(e -> loadData(tfSearch.getText().trim())); top.add(btnSearch); add(top, BorderLayout.NORTH); add(scroll, BorderLayout.CENTER); loadData(""); } private void loadData(String keyword) { model.setRowCount(0); String sql = "SELECT s.stu_no, s.name, s.gender, s.major, d.room_no, s.bed_no " + "FROM student s LEFT JOIN dorm d ON s.dorm_id = d.id " + "WHERE s.stu_no LIKE ? OR s.name LIKE ?"; try (Connection conn = DBHelper.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { String like = "%" + keyword + "%"; ps.setString(1, like); ps.setString(2, like); ResultSet rs = ps.executeQuery(); while (rs.next()) { model.addRow(new Object[]{ rs.getString(1), rs.getString(2), rs.getInt(3) == 1 ? "男" : "女", rs.getString(4), rs.getString(5), rs.getInt(6) }); } } catch (SQLException ex) { JOptionPane.showMessageDialog(this, "加载学生数据失败: " + ex.getMessage()); } } }model.setRowCount(0)是清空表格旧数据的标准做法,比重新 new DefaultTableModel 更省内存。LEFT JOIN 保证没分宿舍的学生也能显示出来,宿舍列为空白,比 INNER JOIN 直接丢数据好。LIKE 查询在课设数据量下没有性能问题,但 keyword 里如果带了 % 或 _,MySQL 会当成通配符,需要时可以用 ESCAPE 处理,课设阶段一般不追究。
增删改的按钮逻辑可以做在同一个面板里。录入按钮弹出一个模态对话框收集学号、姓名、性别、专业、电话,然后执行 INSERT:
btAdd.addActionListener(e -> { // 弹 JDialog 收集信息,这里省略对话框内部布局 String sql = "INSERT INTO student (stu_no, name, gender, major, phone) VALUES (?,?,?,?,?)"; try (Connection conn = DBHelper.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, stuNo); ps.setString(2, name); ps.setInt(3, gender); ps.setString(4, major); ps.setString(5, phone); ps.executeUpdate(); loadData(""); JOptionPane.showMessageDialog(this, "录入成功"); } catch (SQLException ex) { if (ex.getMessage().contains("Duplicate")) { JOptionPane.showMessageDialog(this, "学号已存在"); } else { JOptionPane.showMessageDialog(this, "录入失败: " + ex.getMessage()); } } });executeUpdate()返回受影响行数,这里不关心具体值,但用 try-with-resources 保证连接释放。捕获 SQLException 后判断错误信息里是否包含 Duplicate,是主键或唯一键冲突的常见信号,用一句话提示比直接甩异常堆栈给用户强得多。这是 Java 基础里异常处理的典型应用,答辩时能说清楚。
4.3 宿舍状态面板:用 GridLayout 画床铺
宿舍分配最直观的展示方式是画格子。用一个 JPanel 套 GridLayout,房间有几张床位就放几个 JLabel,每个 JLabel 根据数据库里的入住状态设置背景色或文字「已住/空床」。不需要引入绘图库,Swing 自带能力就够:
public void renderDormStatus(List<Integer> occupiedBeds, int capacity) { panel.removeAll(); panel.setLayout(new GridLayout(0, 4, 8, 8)); for (int i = 1; i <= capacity; i++) { boolean occupied = occupiedBeds.contains(i); JLabel bed = new JLabel( occupied ? "床" + i + " 已住" : "床" + i + " 空床", SwingConstants.CENTER); bed.setOpaque(true); bed.setBackground(occupied ? new Color(255, 182, 193) : new Color(144, 238, 144)); panel.add(bed); } panel.revalidate(); panel.repaint(); }GridLayout(0, 4)表示列数固定 4,行数随内容自动增长,适合四人间布局。removeAll()之后必须调revalidate()和repaint(),否则界面不会刷新,这是 Swing 里最常见的坑。颜色用 RGB 构造,浅红和浅绿在演示时比默认灰色直观很多,截图放到 PPT 里也清晰。
5. 避坑清单:Swing 课程设计最容易翻车的 5 个地方
这个项目我前后帮人调过很多版本,翻车点高度集中。下面五个坑按出现频率排序,每一条都是实际踩过的,现象、原因、解决一次说清。
5.1 中文乱码:界面、数据库和 SQL 文件三个口子
现象:登录界面按钮上的中文显示成方框,或者数据库里查出来是 ??????。
原因:Swing 界面乱码多半是操作系统默认编码不是 UTF-8;数据库乱码是连接 URL 里少了characterEncoding=utf8,或者建库时用了默认 latin1 字符集。
解决:数据库连接 URL 加上useUnicode=true&characterEncoding=utf8,建库语句显式写成DEFAULT CHARACTER SET utf8mb4。Swing 界面在 IDE 里把项目编码统一设成 UTF-8,Windows 下如果按钮还是方框,在 JVM 启动参数加-Dfile.encoding=UTF-8。SQL 脚本文件本身也必须是 UTF-8 保存,用记事本另存时尤其容易存成 ANSI,文件里的中文在导入 MySQL 时就会变成乱码,这是最阴间的坑。
5.2 界面卡死:JDBC 操作跑到了 EDT 线程上
现象:点击「查询」按钮后,整个窗口变成白板,过几秒才恢复,Windows 标题栏显示「未响应」。
原因:Swing 的所有界面刷新都发生在 EDT 单线程上,ActionListener 里的代码默认就在 EDT 里执行。你在里面跑 select 全表 JOIN 甚至嵌套查询,数据库慢一点就把界面线程堵死了。本地数据库数据量小感觉不出来,演示时一旦卡住一次就很尴尬。
解决:耗时操作丢到 SwingWorker 或普通线程里。最简做法是new Thread(() -> loadData(keyword)).start(),注意 loadData 里操作 JTable 的部分要再用SwingUtilities.invokeLater包一层。课程设计里的查询基本都是毫秒级,但写线程的代码可以在报告里单独讲一节「GUI 线程优化」,显得考虑周全。
5.3 JTable 数据不刷新:重新 setModel 而不是改单元格
现象:增删改之后表格还是旧数据,重启才看到变化。
原因:JTable 显示的内容取决于 TableModel,你操作的是数据库,不是 TableModel。没有把数据库最新结果重新灌回 TableModel,界面当然不会变。
解决:每次增删改成功后都调用loadData(),在 loadData 开头执行model.setRowCount(0)清空,再 addRow 填充。如果只改了某个单元格,也可以用table.setValueAt(...),但课程设计里整表重灌最简单可靠。记住这条:数据库变了不等于界面变了,界面变了不等于数据库变了,两者必须显式同步。
5.4 驱动类名和 jar 版本不匹配:ClassNotFoundException
现象:程序一启动就报java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,或者报Public Key Retrieval is not allowed。
原因:lib 里放的是 MySQL 8.x 驱动,代码写的却是 5.x 的老类名;或者反过来。8.x 驱动连 8.0 库还要求额外确认serverTimezone和 SSL 参数。
解决:先看 jar 版本再定类名。mysql-connector-java 5.1.x 用com.mysql.jdbc.Driver,8.0.x 用com.mysql.cj.jdbc.Driver。不想纠结版本就统一用 5.1.49 配 MySQL 5.7,这是最稳的组合,网上能找到的课设模板大多也是这个组合。8.0 驱动连 5.7 库一般能通,反过来 5.1 驱动连 8.0 库大概率报认证或 SSL 错误。
5.5 打包成可执行 jar 后连不上数据库:不要用绝对路径
现象:直接在 IDE 里运行一切正常,导出 Runnable JAR 之后就报配置文件找不到或数据库连不上。
原因:导出 jar 时,lib 里的驱动没有一并打包,或者 jdbc.properties 用了绝对盘符路径D:/project/config.properties,换台机器就失效。
解决:导出时在 IDE 里勾选 Extract required libraries into generated JAR,把 mysql 驱动打进同一个可执行 jar。数据库连接参数直接写成常量放 DBHelper 里,课设规模不值得引入配置文件加载逻辑。如果坚持用配置文件,用class.getResourceAsStream("/config.properties")读取,而不是new FileInputStream。提交前在另一台机器上试跑一遍可执行 jar,这是最实在的验证方式。
6. 从能跑到能答辩:数据完整性验证与报告 PPT 打磨
6.1 一个验证 CRUD 的测试类
答辩前我习惯写一个临时入口类,不启动 GUI,直接对每个 DAO 方法调一遍。这不只是给老师看,更是给自己省心:
public class DataVerify { public static void main(String[] args) { System.out.println("登录验证: " + AdminDao.login("admin", "123456")); System.out.println("新增: " + StudentDao.insert(new Student(...))); System.out.println("查询: " + StudentDao.findByNo("2024001")); System.out.println("更新: " + StudentDao.update(...)); System.out.println("删除: " + StudentDao.delete(1)); System.out.println("CRUD 验证通过"); } }每个方法都返回 boolean,跑一遍就知道哪里断。演示时如果时间紧,直接把这个类的运行结果截图放报告里,比界面截图更有说服力。
6.2 报告与 PPT 的截图顺序
报告里放三张图就够:ER 图、主界面截图、增删改查前后对比截图。截图逻辑是「先建表、再插数据、再操作、最后看结果」,按这个顺序拼图,老师能一眼看懂数据流。PPT 不要放太多代码,重点放表结构截图和运行效果图,每页一句话讲清楚「这页要说明什么」。演示时先跑登录,再演示一次完整的新增学生、分配宿舍、退宿流程,最后点开数据库表展示数据变化,整个闭环不超过五分钟。
6.3 最后的习惯
我去年帮一个学弟验收这个项目,界面做得花里胡哨,结果演示时换宿功能崩溃了两次。后来我养成的习惯是:任何改动之后,先用 DataVerify 把数据库层跑一遍,再开 GUI 点一遍主流程。宁可界面简单,也不能让老师在演示时看到异常弹窗。这个项目真正值钱的地方不是代码量,而是你能把自己的数据流讲清楚,把每个操作对应的 SQL 说出来,把每个异常的可能原因说出来。希望帮到你。
本文还有配套的精品资源,点击获取