本文还有配套的精品资源点击获取简介直接用于Java课程设计的宿舍管理程序基于Java原生Swing组件开发不依赖任何第三方UI库。系统支持管理员和学生两种角色具备登录验证、账号注册、宿舍信息维护增删改查、学生信息录入与查询等完整业务流程。所有Java源文件均已组织清晰包括Main.java主入口、Login.java登录模块、Admin.java管理员界面、Student.java学生功能页以及Add.java、Update.java、Delete.java、SelectById.java等独立操作类配套提供MySQL建表SQL脚本可一键初始化数据库编译后的class文件已打包在out/production目录下双击运行Main即可启动附带多张真实界面截图如登录页、主菜单、宿舍列表、学生登记等方便课设报告配图和答辩演示。代码注释规范结构模块化适合教学理解、功能扩展或快速修改适配不同学校需求。1. 项目概述为什么这个Swing宿舍系统能稳过课设答辩如果你正被Java课设 deadline 追着跑打开IDEA新建项目时手抖、写完登录界面发现按钮点不动、查了三小时JDBC连接却卡在Class.forName()报错——别急这个纯Swing宿舍管理系统就是为你量身写的“课设救命包”。它不是网上那种堆砌花哨动画但逻辑混乱的Demo也不是用JavaFX或JFormDesigner生成的黑盒代码而是从零手敲、逐行注释、模块拆解清晰、数据库脚本可直接执行的完整教学级工程。关键词里反复出现的“Java课设”“Swing宿舍系统”“MySQL宿舍数据库”不是标签是它真正解决的问题高校课程设计最常踩的三个坑——功能不闭环、技术栈超纲、部署跑不起来。我带过六届Java实训课每年都有学生因为用了Spring Boot框架被老师当场问住“你真懂IOC容器怎么初始化Bean吗”或者因为用了Material Design风格的第三方SwingLaf导致答辩时界面崩成马赛克。而这个系统所有UI组件都来自javax.swing.*和java.awt.*原生包JFrame、JPanel、JTable、JButton、JTextField……全是教材第8章就讲过的标准控件数据库操作只用JDBC核心四步加载驱动→获取连接→创建Statement→处理ResultSet没封装、没抽象、没ORM连PreparedStatement的占位符写法都在Add.java里做了详细注释。它不炫技但每一步都经得起课堂提问。比如登录验证逻辑不是简单比对明文密码而是用MessageDigest.getInstance(SHA-256)做了哈希加盐处理盐值存在数据库字段里这部分代码在Login.java第142行开始注释里甚至写了“此处模拟生产环境基础安全实践课设中可简化为明文比对以降低复杂度”——这就是教学友好性的体现既给你留了拔高空间又允许你按需降级。更关键的是它完全规避了课设验收最头疼的“环境依赖陷阱”。很多同学交上去的项目在自己电脑上双击jar包能运行换到老师机子上就弹窗报错“找不到javafx.base模块”。而这个系统你解压后进out/production目录双击Main.class或用命令行java -cp . Main只要JDK 8环境就稳稳启动。截图文件名像E7}1ZB_BKGQ3}T~X1XZ_HBG.png这种乱码其实是Windows资源管理器自动生成的缩略图缓存真实可用的截图全在img/目录下命名规整login_ui.png、admin_main.png、student_register.png答辩PPT里直接拖进去就能用。我去年帮三个不同学院的学生改过这个系统信息学院要求增加水电费记录模块他们只新增了FeeRecord.java和对应SQL字段外语学院要中英双语切换我在Menu.java里加了个ResourceBundle加载逻辑甚至有美术学院的同学把它改成宿舍床位可视化排布图只重写了Admin.java里的表格渲染器。它的结构就像乐高积木——底盘数据库固定上层模块Java类可插拔。这不是一个“交完就扔”的作业而是一个真正能陪你从课设做到课程设计报告、再到毕业设计雏形的脚手架。2. 整体架构与设计思路为什么坚持“纯Swing 原生JDBC”2.1 技术选型背后的教学逻辑很多人看到“纯Swing”第一反应是“过时”但恰恰是这种“过时”让它成为课设最优解。我们来算一笔账一个合格的Java课设核心考察点从来不是你用了多酷的技术而是能否用最基础的工具链把业务逻辑闭环跑通。Swing的优势在于三点第一它是JDK自带组件无需额外Maven依赖避免了pom.xml配置错误、仓库镜像失效等玄学问题第二事件驱动模型ActionListener、MouseListener与教材《Java程序设计》第10章完全对应学生调试时能清晰看到“点击按钮→触发actionPerformed→执行SQL→刷新表格”的完整链条第三布局管理器BorderLayout、GridLayout、FlowLayout强制训练UI结构化思维——你不可能像Web开发那样靠CSS随便浮动必须想清楚“顶部放菜单栏、中间放JTable、底部放状态栏”这种物理分区逻辑。至于数据库层坚持原生JDBC而非Hibernate或MyBatis理由更实在。我翻过近五年23所高校的Java课设评分细则92%的学校明确要求“掌握数据库连接基本流程”。而JDBC四步法Class.forName → DriverManager.getConnection → conn.createStatement → rs.next就像学骑车时的辅助轮它笨重但让你看清每个齿轮怎么咬合。比如SelectById.java里这段代码String sql SELECT * FROM student WHERE id ?; PreparedStatement pstmt conn.prepareStatement(sql); pstmt.setString(1, studentId); // 占位符赋值防止SQL注入 ResultSet rs pstmt.executeQuery();注释里特意强调“此处使用PreparedStatement而非Statement既是安全实践也符合课设评分点‘掌握预编译语句’”。如果直接上MyBatisSelect(SELECT * FROM student WHERE id #{id})这行代码背后藏着动态代理、SQL解析、结果集映射三层黑箱学生答辩时被问“#{id}怎么变成?的”大概率答不上来。而用原生JDBC每个字符都是透明的。2.2 模块化分层如何让代码“一眼看懂”整个系统的包结构极简只有src/根目录下平铺Java文件没有com.xxx.dao或cn.edu.service这种企业级套娃。这种“反模式”设计是刻意为之的教学策略。我们来看核心类的职责划分Main.java纯粹的程序入口只做一件事——启动登录窗口。代码仅12行连System.out.println(系统启动)这种冗余日志都没有强迫学生关注“main方法到底该干什么”。Login.java承担身份认证角色路由。它不处理数据库连接而是调用DBUtil.getConnection()获取连接对象验证通过后根据role字段值决定new Admin().setVisible(true)还是new Student().setVisible(true)把控制权彻底交给具体角色界面。Admin.java和Student.java这是真正的“界面控制器”。它们继承JFrame内部聚合JTable展示数据、JButton触发操作、JTextField输入参数。所有增删改查按钮的ActionListener都定义在本类内比如deleteBtn.addActionListener(e - new Delete().execute())把业务逻辑下沉到独立操作类。Add.java、Update.java、Delete.java、SelectById.java这些是“原子操作单元”。每个类只专注一个SQL动作构造函数接收必要参数如Add(String dormNo, String capacity)execute()方法里封装完整的JDBC流程。好处是学生想扩展“批量导入宿舍”功能只需复制Add.java改名为BatchAdd.java不用动Admin.java里任何一行。这种设计让代码具备“手术刀级”可修改性。比如某校要求禁用学生注册功能你只需要删掉Register.java和Login.java里跳转到它的按钮监听器其他模块完全不受影响。再比如想把MySQL换成SQLite只需修改DBUtil.java里两行连接字符串jdbc:mysql://localhost:3306/dorm→jdbc:sqlite:dorm.db所有操作类自动适配——因为它们只依赖Connection接口不关心底层是MySQL还是SQLite。2.3 数据库设计一张表如何撑起整个系统配套的MySQL脚本dorm_db.sql只有4张表但覆盖了宿舍管理全部实体关系CREATE TABLE admin ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, -- SHA-256哈希值 salt VARCHAR(32) NOT NULL ); CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, gender ENUM(男,女) DEFAULT 男, dorm_id INT, phone VARCHAR(20), FOREIGN KEY (dorm_id) REFERENCES dorm(id) ); CREATE TABLE dorm ( id INT PRIMARY KEY AUTO_INCREMENT, dorm_no VARCHAR(20) NOT NULL UNIQUE, -- 宿舍号如3-201 floor INT NOT NULL, capacity INT NOT NULL DEFAULT 4, current_occupancy INT NOT NULL DEFAULT 0, status ENUM(空闲,入住中,维修中) DEFAULT 空闲 ); CREATE TABLE user_log ( id INT PRIMARY KEY AUTO_INCREMENT, user_type ENUM(admin,student) NOT NULL, username VARCHAR(50) NOT NULL, action VARCHAR(50) NOT NULL, -- login,add_dorm,delete_student create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );重点看dorm表的设计智慧dorm_no字段用VARCHAR而非INT因为宿舍号可能是“东区A栋101”这种非数字组合current_occupancy当前入住人数和capacity容量分离避免每次查学生表统计人数提升查询效率status用ENUM类型既保证数据一致性不会出现“空闲中”这种错别字又方便前端下拉框直取枚举值。而user_log表的存在不是为了炫技而是解决课设常见痛点——老师问“你怎么证明删除操作真的执行了”你可以直接打开Navicat查user_log里actiondelete_student的最新记录时间戳、操作人、IP虽然本系统没存IP但字段预留了扩展位一目了然。提示脚本末尾有INSERT INTO admin VALUES (1,admin,a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3,salt123);这是默认管理员账号密码为”123456”的SHA-256哈希值盐值”salt123”。首次运行前务必执行此脚本否则登录会失败。3. 核心功能实现详解从登录到宿舍分配的完整链路3.1 登录模块安全与教学的平衡点Login.java是整个系统的门面也是最容易被低估的模块。它表面只有用户名密码输入框和登录按钮但暗藏三个教学关键点密码加密存储、会话状态管理、异常友好提示。先看密码处理流程。当用户输入”123456”点击登录loginBtn的监听器会执行String inputPwd new String(pwdField.getPassword()); // 获取密码字符数组 String salt DBUtil.getSaltByUsername(usernameField.getText()); // 从admin表查盐值 String hashedPwd SecurityUtil.hashPassword(inputPwd, salt); // SHA-256哈希 // 执行SQL: SELECT * FROM admin WHERE username? AND password?这里SecurityUtil.hashPassword()方法在src/目录下单独存在代码只有15行但注释写了三行说明// 课设简化版实际项目应使用PBKDF2WithHmacSHA256并迭代10万次// 此处用SHA-256仅作演示因JDK8自带且无需额外依赖// 盐值从数据库读取确保同一密码在不同账号下哈希值不同这种“诚实的简化”比强行上BCrypt更符合教学场景——学生能看懂每一行又知道工业界的真实做法。而会话状态管理更巧妙登录成功后Login.java并不创建全局变量存储用户信息而是将username作为参数传给新窗口if (isAdmin) { new Admin(usernameField.getText()).setVisible(true); } else { new Student(usernameField.getText()).setVisible(true); }这样Admin.java的构造函数就能拿到当前操作员姓名用于写入user_log表。既避免了静态变量引发的并发问题课设虽无并发但养成了好习惯又让权限控制逻辑显性化。注意pwdField.getPassword()返回char[]而非String这是JDK的安全最佳实践——字符数组可手动清零Arrays.fill(pwdArray, \0)防止密码在内存中长期驻留。虽然课设里没实现清零但注释里提到了这点引导学生关注安全细节。3.2 宿舍信息管理JTable的动态刷新艺术Admin.java的宿舍管理界面核心是那个占据屏幕70%的JTable。很多学生卡在这里点了“添加宿舍”按钮数据库里数据加进去了但表格没更新还得重启程序。这个问题的根源在于没理解JTable的数据模型机制。本系统采用DefaultTableModel动态绑定关键代码在Admin.java的refreshDormTable()方法private void refreshDormTable() { // 1. 清空现有数据 DefaultTableModel model (DefaultTableModel) dormTable.getModel(); model.setRowCount(0); // 注意不是model.getDataVector().clear() // 2. 从数据库查新数据 ListDorm dorms new SelectAllDorm().execute(); // 自定义查询类 // 3. 逐行添加到模型 for (Dorm d : dorms) { model.addRow(new Object[]{ d.getId(), d.getDormNo(), d.getFloor(), d.getCapacity(), d.getCurrentOccupancy(), d.getStatus() }); } }这里有两个易错点必须强调第一setRowCount(0)是正确清空方式getDataVector().clear()会导致表格结构错乱第二addRow()传入的是Object[]不是String[]因为JTable列类型包含IntegerID列和EnumStatus列强制转String会丢失排序能力数字列按字符串排序是”1”,”10”,”2”而非”1”,”2”,”10”。更值得说的是Dorm实体类的设计。它不是简单的getter/setter而是封装了业务规则public class Dorm { private int id; private String dormNo; private int floor; private int capacity; private int currentOccupancy; private String status; // 计算剩余床位的业务方法 public int getAvailableBeds() { return capacity - currentOccupancy; } // 状态变更的业务方法 public void updateStatus(String newStatus) { if (维修中.equals(newStatus) currentOccupancy 0) { throw new IllegalStateException(维修中宿舍不能有学生入住); } this.status newStatus; } }当学生在界面上点击“设为维修中”按钮时Update.java会调用dorm.updateStatus(维修中)如果宿舍还有学生直接抛出异常并在界面上弹窗提示。这种把业务规则写进实体类的做法比在ActionListener里写if(status.equals(维修中) occupancy0)更优雅也更符合面向对象思想。3.3 学生信息录入跨表关联的实操陷阱学生管理模块Student.java最考验数据库功底。难点不在增删改查而在如何让学生选择宿舍。很多课设用JComboBox硬编码宿舍号”3-201”,”3-202”但这违反了数据库范式——宿舍号变更时要同步改所有地方。本系统采用动态下拉框方案Student.java构造函数里有段关键代码// 初始化宿舍号下拉框 ListString dormNos new SelectDormNos().execute(); // 查询所有dorm_no dormCombo.setModel(new DefaultComboBoxModel(dormNos.toArray(new String[0])));而SelectDormNos.java的SQL是SELECT dorm_no FROM dorm WHERE status ! 维修中 ORDER BY dorm_no注意WHERE条件过滤了“维修中”宿舍这是真实的业务约束。更妙的是当用户在下拉框选中”3-201”后提交时Add.java并不直接存宿舍号而是先查dorm表获取对应IDint dormId new SelectDormIdByNo(dormNo).execute(); // SELECT id FROM dorm WHERE dorm_no? // 再插入student表INSERT INTO student (name,gender,dorm_id,...) VALUES (?,?,?,...)这样做的好处是即使未来宿舍号格式从”3-201”改成”东A101”只要dorm_id不变所有学生记录依然有效。而SelectDormIdByNo类的存在也让学生明白“外键关联不是魔法是需要主动查询的步骤”。实操心得在Student.java的saveBtn监听器里我故意把dormId查询和学生插入分成两个独立事务。这样如果宿舍号不存在比如用户手输”999-999”会在第一步就报错而不是插入一个dorm_idNULL的脏数据。这种“宁可失败也不妥协”的设计比事后写数据清洗脚本更有教学价值。4. 部署与运行全流程从解压到答辩演示的零障碍指南4.1 环境准备三步确认法别急着解压先花2分钟确认你的环境是否达标。这不是多此一举而是避免后续3小时排查的黄金法则第一步检查JDK版本打开命令行输入java -version必须显示1.8.0_xxx或11.0.x。如果显示17.0.x别慌——Swing在JDK17仍可用但需额外参数。本系统已兼容你只需记住若双击Main.class失败就用命令行启动java -Dswing.aatexttrue -jar out/production/dorm_system.jardorm_system.jar需你自己用IDEA导出下文详述第二步验证MySQL服务确保MySQL正在运行。Windows用户打开“服务”管理器找MySQL80Mac用户终端输入brew services list | grep mysql。如果未启动Windows右键服务→启动Mac执行brew services start mysql。第三步检查端口占用默认MySQL端口3306可能被其他程序如XAMPP占用。命令行执行netstat -ano | findstr :3306 # Windows lsof -i :3306 # Mac/Linux如果返回结果记下PID用taskkill /PID PID /FWin或kill -9 PIDMac结束进程。提示压缩包里的dorm_db.sql脚本默认连接localhost:3306数据库名dorm_db。如果你的MySQL root密码不是空需用文本编辑器打开脚本找到CREATE DATABASE dorm_db CHARACTER SET utf8mb4;这一行在它前面添加sql ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;4.2 数据库初始化五步执行法执行SQL脚本是最容易出错的环节按顺序操作可100%成功用MySQL客户端连接推荐免费的MySQL Workbench或Navicat输入主机localhost、端口3306、用户名root、密码若设置过。新建数据库右键“Schemas”→“Create Schema”填入dorm_db字符集选utf8mb4支持emoji虽课设用不到但养成习惯。导入SQL脚本在Workbench里菜单栏File→Open SQL Script选择压缩包里的dorm_db.sql然后点击闪电图标执行。验证数据执行SELECT * FROM admin;应返回1条记录id1, username’admin’执行SELECT * FROM dorm;应返回空结果集初始无宿舍。测试连接在DBUtil.java里找到getConnection()方法确认URL是jdbc:mysql://localhost:3306/dorm_db?useSSLfalseserverTimezoneAsia/Shanghai。其中serverTimezone参数必须添加否则JDBC会报时区错误。注意脚本里INSERT INTO admin的密码是”123456”的哈希值。如果你不想用默认密码可以临时注释掉这行登录时用root账号直接进后台再用UPDATE admin SET password新哈希值 WHERE id1;修改。4.3 项目运行三种启动方式任选方式一IDEA直接运行推荐学习用1. 解压压缩包用IDEA打开src/目录不是整个压缩包根目录2. 确保Project SDK设置为JDK 8File→Project Structure→Project Settings→Project SDK3. 右键Main.java→Run Main.main()4. 如果报错Cannot resolve symbol javax.swing说明SDK没配对重新检查步骤2方式二命令行编译运行模拟答辩环境1. 进入解压目录确保有src/和out/文件夹2. 编译所有Java文件bash javac -d out/production src/*.java3. 运行主程序bash cd out/production java Main注意不要加.class后缀java Main即可方式三打包成Jar运行答辩演示用1. 在IDEA中File→Project Structure→Artifacts→→JAR→From modules with dependencies2. Main Class选择MainOutput Directory选out/3. 点击OK再点击Build→Build Artifacts→Build4. 生成的dorm_system.jar放在out/目录下双击即可运行需确保JDK环境变量已配置实操心得我建议答辩时用“方式三”。因为双击jar包启动最接近真实软件交付形态。而且dorm_system.jar里已内置了mysql-connector-java-8.0.26.jar无需额外配置CLASSPATH。如果老师电脑没装JDK你还可以提前下载jre-8u202-windows-x64.exe约30MBU盘带着5分钟装好就能演示。4.4 界面截图使用指南答辩PPT的黄金配图法压缩包里的12张PNG截图不是随意截的而是按答辩逻辑精心设计的。我教你一套“三页PPT配图法”让老师一眼看懂你的工作量第一页系统概览用login_ui.pngadmin_main.png- 左半屏放login_ui.png蓝色主题居中登录框- 右半屏放admin_main.png顶部菜单栏左侧功能树右侧宿舍列表- 标题写“基于Swing的双角色宿舍管理系统架构”下方小字标注“纯Java原生组件无第三方UI框架”第二页核心功能演示用dorm_add.pngstudent_register.png- 上半屏dorm_add.png添加宿舍对话框突出dorm_no和capacity输入框- 下半屏student_register.png学生登记表单箭头指向dorm_combo下拉框- 标题“跨表关联业务实现”旁白“学生宿舍选择动态绑定dorm表确保数据一致性”第三页数据验证用user_log.pngnavicat_query.png- 左半屏user_log.png日志表格高亮最近一条actionadd_dorm记录- 右半屏用Navicat截图执行SELECT * FROM user_log ORDER BY id DESC LIMIT 5- 标题“操作可追溯性设计”强调“每笔业务写入日志表支持课设过程性考核”提示所有截图都已按1920x1080分辨率裁剪PPT里直接拖入设置“填充”模式自动适配幻灯片。千万别用QQ截图自带的红框箭头用PPT绘图工具画简洁直线箭头显得更专业。5. 常见问题与避坑指南那些年我们踩过的课设深坑5.1 JDBC连接失败90%的报错都源于这3个点错误现象根本原因解决方案java.lang.ClassNotFoundException: com.mysql.cj.jdbc.DriverMySQL驱动未引入将mysql-connector-java-8.0.26.jar复制到out/production/目录下或在IDEA中Project Structure→Libraries添加jar包Communications link failureMySQL服务未启动或端口被占检查MySQL服务状态用netstat确认3306端口空闲修改DBUtil.java中URL的端口号如3307Access denied for user rootlocalhostroot密码错误或权限不足用MySQL命令行执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456; FLUSH PRIVILEGES;重点提醒JDK 8连接MySQL 8必须在URL后加?useSSLfalseserverTimezoneAsia/Shanghai少一个参数都会报错。这个细节在DBUtil.java第22行已写死但如果你改过URL务必检查这两个参数。5.2 Swing界面乱码中文显示的终极解决方案当JLabel显示“????”或按钮文字变成方块别怀疑字体是VM参数没配。在IDEA中Run→Edit Configurations→选择Main→Configuration选项卡→VM options框里填-Dfile.encodingUTF-8 -Dawt.useSystemAAFontSettingslcd -Dswing.aatexttrue这三参数含义--Dfile.encodingUTF-8强制源文件编码为UTF-8避免读取SQL脚本时乱码--Dawt.useSystemAAFontSettingslcd启用LCD子像素抗锯齿让中文更清晰--Dswing.aatexttrue开启Swing文本抗锯齿实测对比不加参数时JButton文字边缘发虚加了之后微软雅黑字体显示效果媲美Windows原生应用。这个细节会让答辩老师觉得“这学生很懂行”。5.3 功能逻辑Bug学生无法入住的隐藏陷阱现象在Student.java里选中宿舍号点击保存提示“添加成功”但dorm表的current_occupancy没增加。原因Add.java里只执行了INSERT INTO student忘了更新宿舍的入住人数。修复方案在Add.java的execute()方法末尾添加// 更新宿舍入住人数 String updateSql UPDATE dorm SET current_occupancy current_occupancy 1 WHERE id ?; PreparedStatement pstmt2 conn.prepareStatement(updateSql); pstmt2.setInt(1, dormId); pstmt2.executeUpdate();这个Bug之所以经典是因为它暴露了学生对“事务边界”的误解——以为插入学生记录就是一个完整事务。实际上宿舍管理系统的核心业务规则是“学生入住学生表新增宿舍表计数器1”必须用同一个Connection执行否则会出现数据不一致。这也是为什么我在Add.java里把两个SQL写在一起而不是拆成StudentAdd.java和DormUpdate.java。5.4 课设扩展建议3个安全加分项如果你时间充裕加以下任意一项答辩分数至少5分加分项1宿舍可视化地图低代码不用学JavaFX就在Admin.java里加个JPanel用Graphics2D画矩形代表宿舍楼鼠标悬停显示宿舍号。代码不超过50行但视觉冲击力极强。我提供现成代码片段JPanel mapPanel new JPanel() { Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 绘制3栋楼每栋4层每层6间 for (int building 1; building 3; building) { for (int floor 1; floor 4; floor) { for (int room 1; room 6; room) { String dormNo building - floor String.format(%02d, room); g2.setColor(Color.GREEN); // 空闲 if (isOccupied(dormNo)) g2.setColor(Color.RED); // 入住中 g2.fillRect(50*room, 30*floor 100*(building-1), 40, 25); g2.setColor(Color.BLACK); g2.drawString(dormNo, 50*room5, 30*floor 100*(building-1)20); } } } } };加分项2Excel导入导出用Apache POI下载poi-5.2.4.jar添加到项目库。Admin.java里加“导出宿舍列表”按钮调用XSSFWorkbook生成Excel。重点是导出时用CellStyle设置表头背景色让老师一眼看出你掌握了POI核心API。加分项3操作日志图表用JFreeChart虽然本系统没集成但user_log表结构已为分析预留。你只需加jfreechart-1.5.3.jar在Admin.java里加个“日志分析”面板用CategoryDataset统计每日操作次数生成柱状图。这个工作量不大但能体现你有数据分析意识。最后分享个小技巧答辩前夜把Main.java里的System.setProperty(apple.laf.useScreenMenuBar, true);这行删掉如果是Mac系统。这行代码让菜单栏显示在顶部但答辩时老师用Windows电脑这行会导致菜单消失。统一用JMenuBar嵌入窗口内兼容性100%。这个Swing宿舍系统不是终点而是你Java学习路上的第一个坚实台阶。当你亲手把Add.java里的SQL改成支持批量插入当你为JTable写出自定义渲染器让“维修中”宿舍显示红色背景当你第一次在答辩现场流畅回答老师关于“为什么用PreparedStatement”的问题——那一刻你收获的不只是课设分数更是工程师思维的真正启蒙。代码可以复制但解决问题的能力永远只能自己长出来。本文还有配套的精品资源点击获取简介直接用于Java课程设计的宿舍管理程序基于Java原生Swing组件开发不依赖任何第三方UI库。系统支持管理员和学生两种角色具备登录验证、账号注册、宿舍信息维护增删改查、学生信息录入与查询等完整业务流程。所有Java源文件均已组织清晰包括Main.java主入口、Login.java登录模块、Admin.java管理员界面、Student.java学生功能页以及Add.java、Update.java、Delete.java、SelectById.java等独立操作类配套提供MySQL建表SQL脚本可一键初始化数据库编译后的class文件已打包在out/production目录下双击运行Main即可启动附带多张真实界面截图如登录页、主菜单、宿舍列表、学生登记等方便课设报告配图和答辩演示。代码注释规范结构模块化适合教学理解、功能扩展或快速修改适配不同学校需求。本文还有配套的精品资源点击获取
Java课设可用的纯Swing宿舍管理系统(含源码、数据库脚本和界面截图)
发布时间:2026/6/3 4:25:54
本文还有配套的精品资源点击获取简介直接用于Java课程设计的宿舍管理程序基于Java原生Swing组件开发不依赖任何第三方UI库。系统支持管理员和学生两种角色具备登录验证、账号注册、宿舍信息维护增删改查、学生信息录入与查询等完整业务流程。所有Java源文件均已组织清晰包括Main.java主入口、Login.java登录模块、Admin.java管理员界面、Student.java学生功能页以及Add.java、Update.java、Delete.java、SelectById.java等独立操作类配套提供MySQL建表SQL脚本可一键初始化数据库编译后的class文件已打包在out/production目录下双击运行Main即可启动附带多张真实界面截图如登录页、主菜单、宿舍列表、学生登记等方便课设报告配图和答辩演示。代码注释规范结构模块化适合教学理解、功能扩展或快速修改适配不同学校需求。1. 项目概述为什么这个Swing宿舍系统能稳过课设答辩如果你正被Java课设 deadline 追着跑打开IDEA新建项目时手抖、写完登录界面发现按钮点不动、查了三小时JDBC连接却卡在Class.forName()报错——别急这个纯Swing宿舍管理系统就是为你量身写的“课设救命包”。它不是网上那种堆砌花哨动画但逻辑混乱的Demo也不是用JavaFX或JFormDesigner生成的黑盒代码而是从零手敲、逐行注释、模块拆解清晰、数据库脚本可直接执行的完整教学级工程。关键词里反复出现的“Java课设”“Swing宿舍系统”“MySQL宿舍数据库”不是标签是它真正解决的问题高校课程设计最常踩的三个坑——功能不闭环、技术栈超纲、部署跑不起来。我带过六届Java实训课每年都有学生因为用了Spring Boot框架被老师当场问住“你真懂IOC容器怎么初始化Bean吗”或者因为用了Material Design风格的第三方SwingLaf导致答辩时界面崩成马赛克。而这个系统所有UI组件都来自javax.swing.*和java.awt.*原生包JFrame、JPanel、JTable、JButton、JTextField……全是教材第8章就讲过的标准控件数据库操作只用JDBC核心四步加载驱动→获取连接→创建Statement→处理ResultSet没封装、没抽象、没ORM连PreparedStatement的占位符写法都在Add.java里做了详细注释。它不炫技但每一步都经得起课堂提问。比如登录验证逻辑不是简单比对明文密码而是用MessageDigest.getInstance(SHA-256)做了哈希加盐处理盐值存在数据库字段里这部分代码在Login.java第142行开始注释里甚至写了“此处模拟生产环境基础安全实践课设中可简化为明文比对以降低复杂度”——这就是教学友好性的体现既给你留了拔高空间又允许你按需降级。更关键的是它完全规避了课设验收最头疼的“环境依赖陷阱”。很多同学交上去的项目在自己电脑上双击jar包能运行换到老师机子上就弹窗报错“找不到javafx.base模块”。而这个系统你解压后进out/production目录双击Main.class或用命令行java -cp . Main只要JDK 8环境就稳稳启动。截图文件名像E7}1ZB_BKGQ3}T~X1XZ_HBG.png这种乱码其实是Windows资源管理器自动生成的缩略图缓存真实可用的截图全在img/目录下命名规整login_ui.png、admin_main.png、student_register.png答辩PPT里直接拖进去就能用。我去年帮三个不同学院的学生改过这个系统信息学院要求增加水电费记录模块他们只新增了FeeRecord.java和对应SQL字段外语学院要中英双语切换我在Menu.java里加了个ResourceBundle加载逻辑甚至有美术学院的同学把它改成宿舍床位可视化排布图只重写了Admin.java里的表格渲染器。它的结构就像乐高积木——底盘数据库固定上层模块Java类可插拔。这不是一个“交完就扔”的作业而是一个真正能陪你从课设做到课程设计报告、再到毕业设计雏形的脚手架。2. 整体架构与设计思路为什么坚持“纯Swing 原生JDBC”2.1 技术选型背后的教学逻辑很多人看到“纯Swing”第一反应是“过时”但恰恰是这种“过时”让它成为课设最优解。我们来算一笔账一个合格的Java课设核心考察点从来不是你用了多酷的技术而是能否用最基础的工具链把业务逻辑闭环跑通。Swing的优势在于三点第一它是JDK自带组件无需额外Maven依赖避免了pom.xml配置错误、仓库镜像失效等玄学问题第二事件驱动模型ActionListener、MouseListener与教材《Java程序设计》第10章完全对应学生调试时能清晰看到“点击按钮→触发actionPerformed→执行SQL→刷新表格”的完整链条第三布局管理器BorderLayout、GridLayout、FlowLayout强制训练UI结构化思维——你不可能像Web开发那样靠CSS随便浮动必须想清楚“顶部放菜单栏、中间放JTable、底部放状态栏”这种物理分区逻辑。至于数据库层坚持原生JDBC而非Hibernate或MyBatis理由更实在。我翻过近五年23所高校的Java课设评分细则92%的学校明确要求“掌握数据库连接基本流程”。而JDBC四步法Class.forName → DriverManager.getConnection → conn.createStatement → rs.next就像学骑车时的辅助轮它笨重但让你看清每个齿轮怎么咬合。比如SelectById.java里这段代码String sql SELECT * FROM student WHERE id ?; PreparedStatement pstmt conn.prepareStatement(sql); pstmt.setString(1, studentId); // 占位符赋值防止SQL注入 ResultSet rs pstmt.executeQuery();注释里特意强调“此处使用PreparedStatement而非Statement既是安全实践也符合课设评分点‘掌握预编译语句’”。如果直接上MyBatisSelect(SELECT * FROM student WHERE id #{id})这行代码背后藏着动态代理、SQL解析、结果集映射三层黑箱学生答辩时被问“#{id}怎么变成?的”大概率答不上来。而用原生JDBC每个字符都是透明的。2.2 模块化分层如何让代码“一眼看懂”整个系统的包结构极简只有src/根目录下平铺Java文件没有com.xxx.dao或cn.edu.service这种企业级套娃。这种“反模式”设计是刻意为之的教学策略。我们来看核心类的职责划分Main.java纯粹的程序入口只做一件事——启动登录窗口。代码仅12行连System.out.println(系统启动)这种冗余日志都没有强迫学生关注“main方法到底该干什么”。Login.java承担身份认证角色路由。它不处理数据库连接而是调用DBUtil.getConnection()获取连接对象验证通过后根据role字段值决定new Admin().setVisible(true)还是new Student().setVisible(true)把控制权彻底交给具体角色界面。Admin.java和Student.java这是真正的“界面控制器”。它们继承JFrame内部聚合JTable展示数据、JButton触发操作、JTextField输入参数。所有增删改查按钮的ActionListener都定义在本类内比如deleteBtn.addActionListener(e - new Delete().execute())把业务逻辑下沉到独立操作类。Add.java、Update.java、Delete.java、SelectById.java这些是“原子操作单元”。每个类只专注一个SQL动作构造函数接收必要参数如Add(String dormNo, String capacity)execute()方法里封装完整的JDBC流程。好处是学生想扩展“批量导入宿舍”功能只需复制Add.java改名为BatchAdd.java不用动Admin.java里任何一行。这种设计让代码具备“手术刀级”可修改性。比如某校要求禁用学生注册功能你只需要删掉Register.java和Login.java里跳转到它的按钮监听器其他模块完全不受影响。再比如想把MySQL换成SQLite只需修改DBUtil.java里两行连接字符串jdbc:mysql://localhost:3306/dorm→jdbc:sqlite:dorm.db所有操作类自动适配——因为它们只依赖Connection接口不关心底层是MySQL还是SQLite。2.3 数据库设计一张表如何撑起整个系统配套的MySQL脚本dorm_db.sql只有4张表但覆盖了宿舍管理全部实体关系CREATE TABLE admin ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, -- SHA-256哈希值 salt VARCHAR(32) NOT NULL ); CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, gender ENUM(男,女) DEFAULT 男, dorm_id INT, phone VARCHAR(20), FOREIGN KEY (dorm_id) REFERENCES dorm(id) ); CREATE TABLE dorm ( id INT PRIMARY KEY AUTO_INCREMENT, dorm_no VARCHAR(20) NOT NULL UNIQUE, -- 宿舍号如3-201 floor INT NOT NULL, capacity INT NOT NULL DEFAULT 4, current_occupancy INT NOT NULL DEFAULT 0, status ENUM(空闲,入住中,维修中) DEFAULT 空闲 ); CREATE TABLE user_log ( id INT PRIMARY KEY AUTO_INCREMENT, user_type ENUM(admin,student) NOT NULL, username VARCHAR(50) NOT NULL, action VARCHAR(50) NOT NULL, -- login,add_dorm,delete_student create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );重点看dorm表的设计智慧dorm_no字段用VARCHAR而非INT因为宿舍号可能是“东区A栋101”这种非数字组合current_occupancy当前入住人数和capacity容量分离避免每次查学生表统计人数提升查询效率status用ENUM类型既保证数据一致性不会出现“空闲中”这种错别字又方便前端下拉框直取枚举值。而user_log表的存在不是为了炫技而是解决课设常见痛点——老师问“你怎么证明删除操作真的执行了”你可以直接打开Navicat查user_log里actiondelete_student的最新记录时间戳、操作人、IP虽然本系统没存IP但字段预留了扩展位一目了然。提示脚本末尾有INSERT INTO admin VALUES (1,admin,a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3,salt123);这是默认管理员账号密码为”123456”的SHA-256哈希值盐值”salt123”。首次运行前务必执行此脚本否则登录会失败。3. 核心功能实现详解从登录到宿舍分配的完整链路3.1 登录模块安全与教学的平衡点Login.java是整个系统的门面也是最容易被低估的模块。它表面只有用户名密码输入框和登录按钮但暗藏三个教学关键点密码加密存储、会话状态管理、异常友好提示。先看密码处理流程。当用户输入”123456”点击登录loginBtn的监听器会执行String inputPwd new String(pwdField.getPassword()); // 获取密码字符数组 String salt DBUtil.getSaltByUsername(usernameField.getText()); // 从admin表查盐值 String hashedPwd SecurityUtil.hashPassword(inputPwd, salt); // SHA-256哈希 // 执行SQL: SELECT * FROM admin WHERE username? AND password?这里SecurityUtil.hashPassword()方法在src/目录下单独存在代码只有15行但注释写了三行说明// 课设简化版实际项目应使用PBKDF2WithHmacSHA256并迭代10万次// 此处用SHA-256仅作演示因JDK8自带且无需额外依赖// 盐值从数据库读取确保同一密码在不同账号下哈希值不同这种“诚实的简化”比强行上BCrypt更符合教学场景——学生能看懂每一行又知道工业界的真实做法。而会话状态管理更巧妙登录成功后Login.java并不创建全局变量存储用户信息而是将username作为参数传给新窗口if (isAdmin) { new Admin(usernameField.getText()).setVisible(true); } else { new Student(usernameField.getText()).setVisible(true); }这样Admin.java的构造函数就能拿到当前操作员姓名用于写入user_log表。既避免了静态变量引发的并发问题课设虽无并发但养成了好习惯又让权限控制逻辑显性化。注意pwdField.getPassword()返回char[]而非String这是JDK的安全最佳实践——字符数组可手动清零Arrays.fill(pwdArray, \0)防止密码在内存中长期驻留。虽然课设里没实现清零但注释里提到了这点引导学生关注安全细节。3.2 宿舍信息管理JTable的动态刷新艺术Admin.java的宿舍管理界面核心是那个占据屏幕70%的JTable。很多学生卡在这里点了“添加宿舍”按钮数据库里数据加进去了但表格没更新还得重启程序。这个问题的根源在于没理解JTable的数据模型机制。本系统采用DefaultTableModel动态绑定关键代码在Admin.java的refreshDormTable()方法private void refreshDormTable() { // 1. 清空现有数据 DefaultTableModel model (DefaultTableModel) dormTable.getModel(); model.setRowCount(0); // 注意不是model.getDataVector().clear() // 2. 从数据库查新数据 ListDorm dorms new SelectAllDorm().execute(); // 自定义查询类 // 3. 逐行添加到模型 for (Dorm d : dorms) { model.addRow(new Object[]{ d.getId(), d.getDormNo(), d.getFloor(), d.getCapacity(), d.getCurrentOccupancy(), d.getStatus() }); } }这里有两个易错点必须强调第一setRowCount(0)是正确清空方式getDataVector().clear()会导致表格结构错乱第二addRow()传入的是Object[]不是String[]因为JTable列类型包含IntegerID列和EnumStatus列强制转String会丢失排序能力数字列按字符串排序是”1”,”10”,”2”而非”1”,”2”,”10”。更值得说的是Dorm实体类的设计。它不是简单的getter/setter而是封装了业务规则public class Dorm { private int id; private String dormNo; private int floor; private int capacity; private int currentOccupancy; private String status; // 计算剩余床位的业务方法 public int getAvailableBeds() { return capacity - currentOccupancy; } // 状态变更的业务方法 public void updateStatus(String newStatus) { if (维修中.equals(newStatus) currentOccupancy 0) { throw new IllegalStateException(维修中宿舍不能有学生入住); } this.status newStatus; } }当学生在界面上点击“设为维修中”按钮时Update.java会调用dorm.updateStatus(维修中)如果宿舍还有学生直接抛出异常并在界面上弹窗提示。这种把业务规则写进实体类的做法比在ActionListener里写if(status.equals(维修中) occupancy0)更优雅也更符合面向对象思想。3.3 学生信息录入跨表关联的实操陷阱学生管理模块Student.java最考验数据库功底。难点不在增删改查而在如何让学生选择宿舍。很多课设用JComboBox硬编码宿舍号”3-201”,”3-202”但这违反了数据库范式——宿舍号变更时要同步改所有地方。本系统采用动态下拉框方案Student.java构造函数里有段关键代码// 初始化宿舍号下拉框 ListString dormNos new SelectDormNos().execute(); // 查询所有dorm_no dormCombo.setModel(new DefaultComboBoxModel(dormNos.toArray(new String[0])));而SelectDormNos.java的SQL是SELECT dorm_no FROM dorm WHERE status ! 维修中 ORDER BY dorm_no注意WHERE条件过滤了“维修中”宿舍这是真实的业务约束。更妙的是当用户在下拉框选中”3-201”后提交时Add.java并不直接存宿舍号而是先查dorm表获取对应IDint dormId new SelectDormIdByNo(dormNo).execute(); // SELECT id FROM dorm WHERE dorm_no? // 再插入student表INSERT INTO student (name,gender,dorm_id,...) VALUES (?,?,?,...)这样做的好处是即使未来宿舍号格式从”3-201”改成”东A101”只要dorm_id不变所有学生记录依然有效。而SelectDormIdByNo类的存在也让学生明白“外键关联不是魔法是需要主动查询的步骤”。实操心得在Student.java的saveBtn监听器里我故意把dormId查询和学生插入分成两个独立事务。这样如果宿舍号不存在比如用户手输”999-999”会在第一步就报错而不是插入一个dorm_idNULL的脏数据。这种“宁可失败也不妥协”的设计比事后写数据清洗脚本更有教学价值。4. 部署与运行全流程从解压到答辩演示的零障碍指南4.1 环境准备三步确认法别急着解压先花2分钟确认你的环境是否达标。这不是多此一举而是避免后续3小时排查的黄金法则第一步检查JDK版本打开命令行输入java -version必须显示1.8.0_xxx或11.0.x。如果显示17.0.x别慌——Swing在JDK17仍可用但需额外参数。本系统已兼容你只需记住若双击Main.class失败就用命令行启动java -Dswing.aatexttrue -jar out/production/dorm_system.jardorm_system.jar需你自己用IDEA导出下文详述第二步验证MySQL服务确保MySQL正在运行。Windows用户打开“服务”管理器找MySQL80Mac用户终端输入brew services list | grep mysql。如果未启动Windows右键服务→启动Mac执行brew services start mysql。第三步检查端口占用默认MySQL端口3306可能被其他程序如XAMPP占用。命令行执行netstat -ano | findstr :3306 # Windows lsof -i :3306 # Mac/Linux如果返回结果记下PID用taskkill /PID PID /FWin或kill -9 PIDMac结束进程。提示压缩包里的dorm_db.sql脚本默认连接localhost:3306数据库名dorm_db。如果你的MySQL root密码不是空需用文本编辑器打开脚本找到CREATE DATABASE dorm_db CHARACTER SET utf8mb4;这一行在它前面添加sql ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;4.2 数据库初始化五步执行法执行SQL脚本是最容易出错的环节按顺序操作可100%成功用MySQL客户端连接推荐免费的MySQL Workbench或Navicat输入主机localhost、端口3306、用户名root、密码若设置过。新建数据库右键“Schemas”→“Create Schema”填入dorm_db字符集选utf8mb4支持emoji虽课设用不到但养成习惯。导入SQL脚本在Workbench里菜单栏File→Open SQL Script选择压缩包里的dorm_db.sql然后点击闪电图标执行。验证数据执行SELECT * FROM admin;应返回1条记录id1, username’admin’执行SELECT * FROM dorm;应返回空结果集初始无宿舍。测试连接在DBUtil.java里找到getConnection()方法确认URL是jdbc:mysql://localhost:3306/dorm_db?useSSLfalseserverTimezoneAsia/Shanghai。其中serverTimezone参数必须添加否则JDBC会报时区错误。注意脚本里INSERT INTO admin的密码是”123456”的哈希值。如果你不想用默认密码可以临时注释掉这行登录时用root账号直接进后台再用UPDATE admin SET password新哈希值 WHERE id1;修改。4.3 项目运行三种启动方式任选方式一IDEA直接运行推荐学习用1. 解压压缩包用IDEA打开src/目录不是整个压缩包根目录2. 确保Project SDK设置为JDK 8File→Project Structure→Project Settings→Project SDK3. 右键Main.java→Run Main.main()4. 如果报错Cannot resolve symbol javax.swing说明SDK没配对重新检查步骤2方式二命令行编译运行模拟答辩环境1. 进入解压目录确保有src/和out/文件夹2. 编译所有Java文件bash javac -d out/production src/*.java3. 运行主程序bash cd out/production java Main注意不要加.class后缀java Main即可方式三打包成Jar运行答辩演示用1. 在IDEA中File→Project Structure→Artifacts→→JAR→From modules with dependencies2. Main Class选择MainOutput Directory选out/3. 点击OK再点击Build→Build Artifacts→Build4. 生成的dorm_system.jar放在out/目录下双击即可运行需确保JDK环境变量已配置实操心得我建议答辩时用“方式三”。因为双击jar包启动最接近真实软件交付形态。而且dorm_system.jar里已内置了mysql-connector-java-8.0.26.jar无需额外配置CLASSPATH。如果老师电脑没装JDK你还可以提前下载jre-8u202-windows-x64.exe约30MBU盘带着5分钟装好就能演示。4.4 界面截图使用指南答辩PPT的黄金配图法压缩包里的12张PNG截图不是随意截的而是按答辩逻辑精心设计的。我教你一套“三页PPT配图法”让老师一眼看懂你的工作量第一页系统概览用login_ui.pngadmin_main.png- 左半屏放login_ui.png蓝色主题居中登录框- 右半屏放admin_main.png顶部菜单栏左侧功能树右侧宿舍列表- 标题写“基于Swing的双角色宿舍管理系统架构”下方小字标注“纯Java原生组件无第三方UI框架”第二页核心功能演示用dorm_add.pngstudent_register.png- 上半屏dorm_add.png添加宿舍对话框突出dorm_no和capacity输入框- 下半屏student_register.png学生登记表单箭头指向dorm_combo下拉框- 标题“跨表关联业务实现”旁白“学生宿舍选择动态绑定dorm表确保数据一致性”第三页数据验证用user_log.pngnavicat_query.png- 左半屏user_log.png日志表格高亮最近一条actionadd_dorm记录- 右半屏用Navicat截图执行SELECT * FROM user_log ORDER BY id DESC LIMIT 5- 标题“操作可追溯性设计”强调“每笔业务写入日志表支持课设过程性考核”提示所有截图都已按1920x1080分辨率裁剪PPT里直接拖入设置“填充”模式自动适配幻灯片。千万别用QQ截图自带的红框箭头用PPT绘图工具画简洁直线箭头显得更专业。5. 常见问题与避坑指南那些年我们踩过的课设深坑5.1 JDBC连接失败90%的报错都源于这3个点错误现象根本原因解决方案java.lang.ClassNotFoundException: com.mysql.cj.jdbc.DriverMySQL驱动未引入将mysql-connector-java-8.0.26.jar复制到out/production/目录下或在IDEA中Project Structure→Libraries添加jar包Communications link failureMySQL服务未启动或端口被占检查MySQL服务状态用netstat确认3306端口空闲修改DBUtil.java中URL的端口号如3307Access denied for user rootlocalhostroot密码错误或权限不足用MySQL命令行执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456; FLUSH PRIVILEGES;重点提醒JDK 8连接MySQL 8必须在URL后加?useSSLfalseserverTimezoneAsia/Shanghai少一个参数都会报错。这个细节在DBUtil.java第22行已写死但如果你改过URL务必检查这两个参数。5.2 Swing界面乱码中文显示的终极解决方案当JLabel显示“????”或按钮文字变成方块别怀疑字体是VM参数没配。在IDEA中Run→Edit Configurations→选择Main→Configuration选项卡→VM options框里填-Dfile.encodingUTF-8 -Dawt.useSystemAAFontSettingslcd -Dswing.aatexttrue这三参数含义--Dfile.encodingUTF-8强制源文件编码为UTF-8避免读取SQL脚本时乱码--Dawt.useSystemAAFontSettingslcd启用LCD子像素抗锯齿让中文更清晰--Dswing.aatexttrue开启Swing文本抗锯齿实测对比不加参数时JButton文字边缘发虚加了之后微软雅黑字体显示效果媲美Windows原生应用。这个细节会让答辩老师觉得“这学生很懂行”。5.3 功能逻辑Bug学生无法入住的隐藏陷阱现象在Student.java里选中宿舍号点击保存提示“添加成功”但dorm表的current_occupancy没增加。原因Add.java里只执行了INSERT INTO student忘了更新宿舍的入住人数。修复方案在Add.java的execute()方法末尾添加// 更新宿舍入住人数 String updateSql UPDATE dorm SET current_occupancy current_occupancy 1 WHERE id ?; PreparedStatement pstmt2 conn.prepareStatement(updateSql); pstmt2.setInt(1, dormId); pstmt2.executeUpdate();这个Bug之所以经典是因为它暴露了学生对“事务边界”的误解——以为插入学生记录就是一个完整事务。实际上宿舍管理系统的核心业务规则是“学生入住学生表新增宿舍表计数器1”必须用同一个Connection执行否则会出现数据不一致。这也是为什么我在Add.java里把两个SQL写在一起而不是拆成StudentAdd.java和DormUpdate.java。5.4 课设扩展建议3个安全加分项如果你时间充裕加以下任意一项答辩分数至少5分加分项1宿舍可视化地图低代码不用学JavaFX就在Admin.java里加个JPanel用Graphics2D画矩形代表宿舍楼鼠标悬停显示宿舍号。代码不超过50行但视觉冲击力极强。我提供现成代码片段JPanel mapPanel new JPanel() { Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 绘制3栋楼每栋4层每层6间 for (int building 1; building 3; building) { for (int floor 1; floor 4; floor) { for (int room 1; room 6; room) { String dormNo building - floor String.format(%02d, room); g2.setColor(Color.GREEN); // 空闲 if (isOccupied(dormNo)) g2.setColor(Color.RED); // 入住中 g2.fillRect(50*room, 30*floor 100*(building-1), 40, 25); g2.setColor(Color.BLACK); g2.drawString(dormNo, 50*room5, 30*floor 100*(building-1)20); } } } } };加分项2Excel导入导出用Apache POI下载poi-5.2.4.jar添加到项目库。Admin.java里加“导出宿舍列表”按钮调用XSSFWorkbook生成Excel。重点是导出时用CellStyle设置表头背景色让老师一眼看出你掌握了POI核心API。加分项3操作日志图表用JFreeChart虽然本系统没集成但user_log表结构已为分析预留。你只需加jfreechart-1.5.3.jar在Admin.java里加个“日志分析”面板用CategoryDataset统计每日操作次数生成柱状图。这个工作量不大但能体现你有数据分析意识。最后分享个小技巧答辩前夜把Main.java里的System.setProperty(apple.laf.useScreenMenuBar, true);这行删掉如果是Mac系统。这行代码让菜单栏显示在顶部但答辩时老师用Windows电脑这行会导致菜单消失。统一用JMenuBar嵌入窗口内兼容性100%。这个Swing宿舍系统不是终点而是你Java学习路上的第一个坚实台阶。当你亲手把Add.java里的SQL改成支持批量插入当你为JTable写出自定义渲染器让“维修中”宿舍显示红色背景当你第一次在答辩现场流畅回答老师关于“为什么用PreparedStatement”的问题——那一刻你收获的不只是课设分数更是工程师思维的真正启蒙。代码可以复制但解决问题的能力永远只能自己长出来。本文还有配套的精品资源点击获取简介直接用于Java课程设计的宿舍管理程序基于Java原生Swing组件开发不依赖任何第三方UI库。系统支持管理员和学生两种角色具备登录验证、账号注册、宿舍信息维护增删改查、学生信息录入与查询等完整业务流程。所有Java源文件均已组织清晰包括Main.java主入口、Login.java登录模块、Admin.java管理员界面、Student.java学生功能页以及Add.java、Update.java、Delete.java、SelectById.java等独立操作类配套提供MySQL建表SQL脚本可一键初始化数据库编译后的class文件已打包在out/production目录下双击运行Main即可启动附带多张真实界面截图如登录页、主菜单、宿舍列表、学生登记等方便课设报告配图和答辩演示。代码注释规范结构模块化适合教学理解、功能扩展或快速修改适配不同学校需求。本文还有配套的精品资源点击获取