Java Web酒店管理系统开发实战:Spring Boot+MyBatis完整实现
简介这是一套基于 IDEA 开发、采用 Maven 拆分聚合的酒店管理系统完整工程面向毕业设计、课程设计、期末大作业、工程实训与初期项目立项等场景。后端由 JSP、Spring、Spring MVC、MyBatis Plus、Shiro 构成并接入第三方短信验证接口前端使用 layUI 与 EasyUI数据库为 MySQL。资源包共 2000 个文件约 111.36MB其中 718 个 CSS、613 个 HTML、439 个 JS、96 个 JSP以及若干 JSON、XML、JAVA 文件涵盖页面样式、前端交互、后端接口与配置信息目录结构清晰便于对照学习和二次开发。已有 37 人学习下载。项目经过严格测试功能完整可用于复现复刻也可作为设计报告的参考蓝本资源内包含源码、工程文件及说明如有适合需要完整可运行项目来支撑答辩或扩展功能的开发者。下载后如遇环境配置或运行问题可与作者交流获取帮助。 做酒店管理系统这个项目的人真的非常多可以说是我见过最经典的 Java Web 练手题目之一。我在 IDEA 里从零到一完整实现过一版从表结构设计到房间状态流转都踩过不少坑这篇博文就把整套思路、技术选型和实操步骤完整梳理一遍包括那些网上教程不会告诉你的细节。无论你是准备课程设计、毕业设计还是想通过一个完整项目巩固 Spring Boot 和 MyBatis 的用法这篇内容都适合你。1. 这项目到底做了什么值不值得做酒店管理系统本质上是典型的 CRUD 加业务流程管理项目核心就三件事管房间、管客户、管订单。听起来简单但它完整覆盖了一个真实业务系统的所有关键环节登录认证、数据建模、状态流转、金额计算、统计查询每一块都是找工作面试时会被反复问到的内容。我选择基于 IDEA 来开发原因很简单——IDEA 是当前 Java 开发事实上的标准 IDE它的代码提示、调试器、Git 集成、数据库工具都做得非常成熟。用 IDEA 做这种项目你可以把精力放在业务逻辑本身而不是跟编辑器较劲。搭好环境之后从创建 Spring Boot 项目到跑通第一个接口全程鼠标点点点就能完成。这类项目真正有价值的地方在于业务闭环。酒店的房间不是静态数据它有空闲、已预订、已入住几个状态客户下单要考虑日期冲突退房时要按天数算钱。这些逻辑串起来就是一个完整的小型业务系统远比单纯写几个增删改查接口有含金量。做完这个项目你对 Spring Boot MyBatis 的整体协作方式、前后端数据交互、数据库表之间的关系都会有非常直观的理解。2. 环境准备与IDEA配置别在这一步劝退2.1 工具版本怎么选很多初学者一开始就在环境上卡住。我的建议是不用追新用稳定版本。JDK 用 8 或者 11 都可以Spring Boot 用 2.7.x 系列Maven 用 3.8.xMySQL 用 5.7 或 8.0。这套组合在网上能找到海量资料遇到问题也好搜。IDEA 方面我推荐直接用 IntelliJ IDEA旗舰版或者社区版都行。社区版免费日常 Java 开发完全够用不需要花时间折腾其他东西。如果你主要做后端开发不涉及前端专业框架社区版是你最省心的选择。2.2 IDEA最关键的几处配置IDEA 装完之后不要急着写代码先做三件事。第一是配置 Maven。打开 Settings → Build Tools → Maven把 Maven home path 指向你本地解压的 Maven 目录User settings file 指向你的 settings.xml。然后在 settings.xml 里配置阿里云镜像不然下载依赖会慢到你怀疑人生。mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror第二是配置 JDK。在 Project Structure → Project 里把 SDK 选成你安装的 JDK 版本Language level 选择对应的版本。这里最容易踩的坑是JDK 装好了但 IDEA 里的 Project SDK 还是空的导致代码标红。第三是建议在 IDEA 自带的 Database 面板里连接一次你的 MySQL 数据库好处是后面写 SQL、看表结构都不用再切到 Navicat直接在 IDEA 里操作。注意settings.xml 里不要只配置 mirror最好把本地仓库位置也设一下。默认本地仓库在用户目录下的 .m2 文件夹我习惯改成 D 盘或其他非系统盘避免重装系统时环境全丢。3. 技术选型与表结构设计先把地基打牢3.1 技术栈老牌组合最稳技术选型我没有做任何花哨的东西就是 Spring Boot MyBatis MySQL前端用简单的 Thymeleaf 模板引擎加上 Bootstrap。这套组合的好处是学习曲线平缓每一层的作用都非常清晰。Spring Boot 负责装好整个应用的骨架MyBatis 负责数据库操作Thymeleaf 直接在 HTML 里写数据渲染逻辑配合 Bootstrap 能快速出一个看着不丑的管理界面。很多人会纠结要不要用 MyBatis-Plus我建议学习阶段先用原生 MyBatis把 SQL 自己写一遍。等你理解了 Mapper 接口和 XML 的映射关系再切换 MyBatis-Plus 只是加一个依赖的事。直接用 Plus 会让你跳过很多基础概念后面排查问题会吃力。3.2 数据库设计五张表搞定核心业务我设计的数据库一共六张表覆盖了用户、房间、客户、预订、入住这几个核心概念。下面是表结构和关键字段说明。表名作用关键字段sys_user系统登录用户id, username, passwordt_room房间信息id, room_no, room_type, price, statust_customer客户信息id, name, phone, id_cardt_reservation预订记录id, room_id, customer_id, check_in_date, check_out_date, statust_checkin入住记录id, reservation_id, room_id, customer_id, deposit, create_timet_order退房结算订单id, checkin_id, total_amount, settle_time核心表就是上面这些关键的 DDL 也比较简洁比如房间表我这样建CREATE TABLE t_room ( id int NOT NULL AUTO_INCREMENT, room_no varchar(10) NOT NULL COMMENT 房间号, room_type varchar(20) DEFAULT NULL COMMENT 房型单人间/双人间/套房, price decimal(10,2) DEFAULT NULL COMMENT 门市价, status tinyint DEFAULT 0 COMMENT 0-空闲 1-已预订 2-已入住, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;状态字段用数字而不是字符串国内大多数业务系统都这么设计。好处是存储空间小、查询效率高但需要在代码里定义常量或枚举来对应。设计表的时候最大的教训是预订表和入住表一定要分开。最开始我想省事一张订单表搞定所有结果退房结算时逻辑混乱得不行。拆开之后思路清晰很多——预订是客户还没来入住的客户已经到了这两种数据的状态完全不同。4. 核心功能实现把房间状态流转玩明白4.1 登录认证学习项目别上框架登录认证这块我没有引入 Spring Security原因是这个项目体量用不上那么重的框架学习阶段自己写个拦截器更能理解原理。用户登录成功后把用户信息放 Session同时写一个拦截器统一校验。public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session request.getSession(); Object user session.getAttribute(loginUser); if (user null) { response.sendRedirect(/login); return false; } return true; } }密码存储绝对不要用明文我用的 BCrypt 加密Spring Security 里的 crypto 模块可以直接引用不需要引入整个 Security 框架。注意拦截器一定要把你放行的路径配置对了比如 /login、/css/、/js/这些。我一开始忘了放行静态资源导致登录页 CSS 全部加载失败页面丑成一坨排查了半天才发现是拦截器把所有静态请求也拦了。4.2 房间管理与状态机房间状态是整个系统的核心我的设计是 0-空闲、1-已预订、2-已入住。三种状态之间的流转关系空闲 → 已预订客户下预订单已预订 → 已入住客户到店办理入住已入住 → 空闲客户退房结账已预订 → 空闲客户取消预订或超时未到这个流转关系我用一个单独的 RoomStatus 常量类来管理避免魔法数字散落在代码各处。改房间状态时前端下拉列表要根据当前状态动态生成选项不能让人把一个已入住的房间改成空闲否则账目就乱了。4.3 预订、入住、退房的完整闭环预订的核心逻辑是日期冲突校验。客户要订某个房间之前必须检查这个房间在目标时间段内是不是已经被占了。SQL 这样写select count(*) from t_reservation where room_id #{roomId} and status in (0, 1) and ((check_in_date #{checkOutDate} and check_out_date #{checkInDate}))这个时间段重叠的判断条件凡是做过排课、订房、会议室预约的人应该都不陌生——新订单的开始时间要小于已有订单的结束时间新订单的结束时间要大于已有订单的开始时间条件成立就说明有重叠。入住办理比较简单先把预订状态改成已使用然后往入住表插一条记录同时把房间状态改成已入住。退房结账是另一个容易出问题的地方房价 × 天数但延迟退房怎么收费、押金怎么抵扣这些业务规则都要提前想好。我当时的规则是下午两点前退房不加钱两点后按半天收超过六点按全天收。用 Java 写天数计算时有个坑直接拿毫秒数除以 86400000 会有问题最好用 LocalDate 的 ChronoUnit.DAYS.between 方法能避免夏令时和毫秒舍入带来的误差。5. 从零创建工程一套能直接跑通的步骤5.1 新建Spring Boot项目打开 IDEA选择 New Project → Spring Initializr。如果你访问 start.spring.io 很慢可以把 Server URL 改成阿里云的https://start.aliyun.com速度会快很多。GAV 坐标自己定好Java 版本选 8依赖那里勾选 Spring Web、Thymeleaf、MyBatis Framework、MySQL Driver 这四个就够了。项目创建完后IDEA 会自动下载依赖第一次会比较慢等右下角进度条跑完就好。如果下载失败检查一下上一章说的 Maven 镜像配置。5.2 配置文件与代码分层application.yml 里的配置是重头戏数据库连接一定要把时区参数带上server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/hotel_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.hotel.entity configuration: map-underscore-to-camel-case: true最后那个map-underscore-to-camel-case: true非常关键它能让数据库的下划线字段名自动映射成 Java 的驼峰属性名比如room_no可以自动映射到roomNo字段不用在 XML 里写一堆 resultMap。代码分层我严格按照 Controller → Service → Mapper 三层来走实体类放 entity 包统一放在 com.example.hotel 包下面。5.3 跑通一次全流程基础代码写完之后我最先跑通的是房间列表查询。先在 t_room 表里插几条测试数据然后写 RoomMapper 接口public interface RoomMapper { ListRoom findAll(); Room findById(Integer id); int updateStatus(Param(id) Integer id, Param(status) Integer status); }再写对应的 RoomMapper.xml注意 namespace 一定要和接口全限定名一致。接着写 RoomService 和 RoomController最后在 Thymeleaf 模板里用th:each循环渲染列表。这一套流程跑通之后剩下的预订、入住功能就是在它的基础上加业务判断而已。重点每次改完 Mapper XML 里的 SQL建议按 CtrlShiftF9 重新编译一下对应模块否则可能加载到旧的 SQL。IDEA 有时候不会自动热更新 XML 文件我因为这个改 SQL 不生效的问题浪费过不少时间。6. 实操中遇到的坑与排查技巧整个项目做下来遇到的问题大大小小有十几个下面这几个最有代表性分享出来帮大家少走弯路。Maven 依赖下载慢或失败。除了配阿里云镜像还要注意 IDEA 里 Maven 的 Always update snapshots 选项很多时候 IDEA 缓存了旧的失败记录导致后续即使镜像通了也不重新下载。遇到这种情况执行mvn clean package -U强制刷新一次。启动报数据库连接失败。先确认 MySQL 服务有没有启动再用命令行工具试一下能不能连上。很多时候是密码写错或者时区参数没加报错信息里带The server time zone value基本就是时区问题。MyBatis 报 Invalid bound statement (not found)。这基本是 XML 文件没有正确扫描到。检查三点pom 里有没有把 mapper 目录打进类路径resource 文件夹下的 XML 一般没问题、application.yml 的 mapper-locations 路径对不对、XML 的 namespace 和接口是不是一致。IDEA 修改代码后不生效。Spring Boot 默认没开热部署我每次改完代码都手动重启后来干脆加了一个依赖 spring-boot-devtools改完代码自动重启效率提升很明显。不过要注意 devtools 和远程调试有冲突本地开发用就好。Git 提交代码时报错。IDEA 里 Git 提交如果提示Please tell me who you are说明没有设置用户名和邮箱在终端里执行git config --global user.name 你的名字 git config --global user.email 你的邮箱端口被占用。IDEA 启动时提示Port 8080 was already in use先查一下是什么进程占用的端口。Windows 上是netstat -ano | findstr 8080然后去任务管理器结束对应 PID 的进程或者直接改 application.yml 里的 server.port。7. 写在最后几点真实体会项目全部跑通之后我的感受是酒店管理系统这种老牌项目能够长盛不衰是因为它麻雀虽小、五脏俱全。开发过程中最值钱的部分不是代码量而是业务流程设计的思维——房间状态怎么流转、订单怎么关联、日期冲突怎么判断这些问题面试官随便挑一个都能聊很久。我个人有个建议第一版不要追求功能大而全先把预订、入住、退房这个闭环做到毫无 bug然后把代码重构得干净一点把异常处理做好这比堆十个华而不实的功能都有用。等这个闭环完全跑通你自然会知道哪些地方可以扩展比如接入支付、做会员等级、上线小程序端整个系统的扩展路径会非常清晰。做完这个项目之后我对 IDEA 的熟练度也上了一个台阶快捷键、断点调试、数据库面板、Git 操作这些都已经变成了肌肉记忆。工具这个东西就是这样在真实项目中反复用才能真正内化成自己的技能。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →