☰
JavaWeb云借阅图书管理系统:从源码部署到答辩高分的完整指南
2026/9/28 3:16:00 网站建设 项目流程

简介:基于 JavaWeb 的云借阅图书管理系统,是一套面向高校计算机专业毕业设计的完整项目源码,覆盖图书借阅、归还预约、读者信息管理、云书库分类检索等核心业务模块,前后端结构完整,可直接运行,适合正在准备毕设或希望系统学习 JavaWeb 开发的同学。资源包共 169 个文件,以 Java 源码、JSP 动态页面、CSS/JS 前端资源、Spring/MyBatis 配置文件及 SQL 数据库脚本为主,辅以必要的 jar 包和部署描述文件,压缩包整体约 36.95MB,目录划分清晰,便于按 controller、service、dao、页面等分层阅读。目前已有 795 人学习下载,项目经过高分毕业设计验证,代码完整、运行稳定,下载后导入 IDE 并配置数据库即可使用,既是毕业设计、课程设计的优秀参考,也能帮助开发者深入理解 SSM 架构下的图书管理业务流程与前后端交互方式。

1. 基于 javaweb 的云借阅图书管理系统,拿到手先别急着改代码

“基于javaweb的云借阅图书管理系统源码+数据库(毕业设计).zip”这个包名,看起来只是“源码 + 数据库”两个词,实际是一套完整的图书借阅网站。技术栈一般是 JSP、Servlet、MySQL,名字叫“云借阅”,本质是浏览器端的图书管理网站。它要解决的问题很具体:让读者在网页上检索图书、借书还书,让管理员能确认借出、登记归还、查逾期。

对准备答辩的在校生来说,这套项目最大的价值不是“源代码多”,而是数据库表和业务状态能一对一讲清楚,比纯前端、纯算法项目好讲。但我见过太多同学一解压就直接去 IDEA 里点运行。我建议还是先花半天把表结构和借阅流程理顺,否则后面改需求、补功能、应付提问都容易翻车。下面我从业务到代码一步步说。

2. 先读懂业务:云借阅的角色、借阅状态与核心数据表

2.1 三种角色:读者、管理员和图书管理员的权限边界

云借阅系统虽然名字带了“云”,在毕设代码里通常还是传统的 B/S 三层角色设计。角色一般放在同一个 user 表里,用 role 字段区分:0 是系统管理员,1 是图书管理员,2 是普通读者。

  • 普通读者:注册、登录、检索图书、查看详情、借书、续借、还书、查看自己的借阅记录。
  • 图书管理员:处理借阅请求、办理还书、登记图书、处理超期罚款。
  • 系统管理员:维护读者和管理员账号、管理分类、查看统计报表。

为什么不用三张表分别存?因为角色数量少,而且共用一张表做登录认证最简单。如果在答辩时被问到,你可以说“用一张表节省了用户系统的复杂度,再用 role 字段做权限控制”,这个答案是能站得住的。真正要留意的是权限怎么落地,不落地的话,任何读者都能直接访问管理员页面,就是一个大隐患。

常见做法是加一个 AuthFilter 拦截器,对所有 .jsp 和 Servlet 请求做登录与角色校验。比如 /admin/ 前缀的路径要求 role=0,/librarian/ 前缀要求 role=1,不满足就重定向回登录页。这个 Filter 是整个项目里最容易出问题也最容易讲的部分,后面第 5 章再细说。

2.2 借阅流程的状态流转:从预约到归还

不要以为借书就是“点个按钮插一条记录”。能给高分的系统,会把借阅记录做成状态机。状态字段一般叫 status,用数字表示状态。常见约定:

状态值含义显示给用户
0在借中借阅中
1已归还已还
2已逾期已超期
3预约待取到货可借

流程上,一位读者检索到《Java 编程思想》,发现所有副本都被借走,就提交预约。预约成功后系统把某本书的副本锁住。等上一个读者还书,状态从“在借”变为“可预约取书”;管理员确认后,生成一条 borrow_record,状态变为“在借中”。到了应还日期读者没还,查询时判定状态为逾期。

很多源码没有定时任务,而是每次查询时判断“due_date < NOW() AND status=0 就当作逾期”。这个做法简单,不用跑后台 JOB,答辩时解释也更直观。关键是不要在 JSP 里直接写这段判断,应该在 service 层调用一个 updateOverdue(),否则页面一刷新就重复计费。

罚款计算也建议集中:超期天数 × 单日罚款。写代码时可以这样组织:

long overdueDays = ChronoUnit.DAYS.between(dueDate.toInstant(), LocalDate.now().atStartOfDay()); double fine = overdueDays > 0 ? overdueDays * 0.5 : 0;

参数说明:ChronoUnit.DAYS.between 是 JDK8 的时间计算方式,比 Date 的 getTime() 相减再除以 86400000 更可读,也能避免跨时区误差。单日罚款 0.5 元是演示值,需要从系统参数配置表读取时记得别写死。

2.3 书目、副本和库存:最容易讲混的一张表

图书表和借阅记录的关系,是这套源码里最重要的一组外键。这里先搞清楚“库存数量到底存哪”。

最简单的一版是 book 表里只有一条记录代表“某一本书”,再配 total_count 和 available_count 两个数字。借出时 available_count 减一,还书时加一。这种设计在毕设里足够,而且代码量最少。

复杂一点的是 book 和 book_copy 分离:book 存书名、作者、ISBN、出版社,book_copy 存每一本实体书的编号、入库时间、状态。借阅记录关联的是 copy_id。好处是能追踪“具体哪一本被借走”,但借出和还书逻辑要同时改。

如果你拿到的是单表库存版,我建议不要强行拆表,答辩时反而会被追问“那同一本书的两个副本怎么区分”。你就明确回答:“本项目以书名为一条书目,借阅记录用 book_id + 用户 id 记录,库存用可借数字表示。”这是合理的课程设计边界。

2.4 核心数据表与字段设计参考

拿到 zip 后先别急着跑代码,打开数据库脚本看清楚有哪些表。一般而言至少会有这五张:

表名关键字段用途
userid, username, password, role, status登录账号统一入口
categoryid, name图书分类
bookid, isbn, title, author, category_id, total_count, available_count, cover书目信息
borrow_recordid, user_id, book_id, borrow_date, due_date, return_date, status, fine借阅流水
reservationid, user_id, book_id, reserve_date, status预约记录

建表参考可以这样:

CREATE TABLE book ( id INT PRIMARY KEY AUTO_INCREMENT, isbn VARCHAR(20) NOT NULL, title VARCHAR(128) NOT NULL, author VARCHAR(64), category_id INT, total_count INT DEFAULT 1, available_count INT DEFAULT 1, publish_date DATE, cover VARCHAR(255), KEY idx_category (category_id), KEY idx_title (title) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这里值得解释两点。第一,字符集建议用 utf8mb4 而不是 utf8,因为 utf8 在 MySQL 里不是真正的全量 Unicode,存不了部分生僻字和表情符号。第二,isbn 和 title 都建了二级索引,是因为检索图书是最频繁的操作;但不要给 publish_date 单独建索引,数据量小,建了反而浪费空间。

如果你发现原脚本用的是 utf8,并且数据库导入后中文变乱码,优先考虑把建表语句里的 CHARSET=utf8 改成 CHARSET=utf8mb4,而不是去改 Java 代码。这属于“先改库,再改连接”的顺序,可以少踩很多坑。

3. 把项目跑起来:JDK + Tomcat + MySQL 的运行三步走

3.1 版本组合:JDK 8、Tomcat 8.5、MySQL 5.7 最省事

javaweb 老项目最怕的是版本太新。JDK 17、Tomcat 10、MySQL 8 虽然都能跑,但 Tomcat 10 把 JavaEE 包名从 javax.* 改成了 jakarta.*,很多旧源码直接编译报错;MySQL 8 要求驱动名带 cj,如果代码里还是 com.mysql.jdbc.Driver,也会启动失败。

建议直接装这套组合:JDK 1.8、Tomcat 8.5、MySQL 5.7。这不是因为我守旧,而是这套组合在大量 javaweb 毕设源码里兼容性最好。如果你电脑里已经有 MySQL 8 也没关系,后面配置连接串时把驱动换成 com.mysql.cj.jdbc.Driver 即可。

安装好先用命令确认:

java -version mysql --version

参数说明:这两个命令分别检查 JDK 和 MySQL。如果某一个命令提示 not recognized,说明环境变量没有配好,不要急着开 IDEA,先修环境变量,否则 IDEA 里 Tomcat 也可能找不到 JRE。有些压缩包里没有 Maven,因为很多课程设计直接把 jar 放进 WEB-INF/lib 目录,这时不需要执行 mvn 命令,用 IDEA 打开项目后手动把 lib 目录加到 Libraries 里。

3.2 导入数据库:先建库再导脚本,顺序不要反过来

解压 zip 后一般能看到 sql 目录或多个 .sql 文件。常见文件名是 cloud_library.sql、init.sql、数据库文件.sql。导入前先创建空库:

mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS cloud_library DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" mysql -uroot -p cloud_library < cloud_library.sql

如果脚本本身没有 CREATE DATABASE,第一步必须手动建库,否则导入会报“No database selected”。如果脚本里已经写了 USE cloud_library,第二行可以不带库名直接导入,但上面的写法更保险。

导入完成后验证一下:

USE cloud_library; SHOW TABLES; SELECT * FROM user;

参数说明:用户名 root 和密码都是你本地 MySQL 的配置。SELECT * FROM user 主要看初始账号有没有导进去,很多源码包里预置了 admin/admin123。如果查询结果出现中文乱码,在导入前先确认建表字符集,不要急着进 Java 代码改。Windows 的 cmd 执行 mysql 命令时如果报中文乱码或语法错误,可以在命令行先执行chcp 65001切到 UTF-8 编码。

提示:导入 SQL 时如果脚本里有外键,先导入父表再导入子表。否则 MySQL 会因为找不到被引用的表而中断执行。

3.3 数据库连接配置:改驱动、改 URL、改密码

源码里一般会有一个 jdbc.properties 或 DBUtil.java,集中存放连接信息。我的习惯是优先找 jdbc.properties,因为改配置不用重新编译。常见内容如下:

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/cloud_library?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=123456

参数说明:driver 如果你是 MySQL 5.7 就用 com.mysql.jdbc.Driver,MySQL 8 就要改成 com.mysql.cj.jdbc.Driver,这个坑最常见。url 里的 useUnicode=true 和 characterEncoding=utf8 是解决中文乱码的关键;useSSL=false 避免本地连接时频繁警告;serverTimezone=Asia/Shanghai 是 MySQL 8 必须加的参数,否则会报时区错误。

如果源码里没有 properties 文件,而是 DBUtil.java 里写死字符串,那就直接在代码里改。建议改成从 properties 读取,改动量不大,而且答辩时说“数据库连接集中配置,方便换测试环境和生产环境”是加分项。

3.4 用 IDEA 部署 Tomcat:Artifact 和 Deployment 是关键

打开 IDEA 后执行这几步:

  1. File -> Open,选择解压后的项目文件夹,等待 IDEA 识别。
  2. 打开 File -> Project Structure,确认 SDK 是 1.8,项目语言级别是 8。
  3. 如果是非 Maven 项目,点击 Libraries 添加 WEB-INF/lib 目录里的 jar,否则启动时会报 ClassNotFoundException。
  4. 打开 Run -> Edit Configurations,点加号选择 Tomcat Server -> Local,在 Server 页里选择 Tomcat 目录。
  5. 切到 Deployment 页,点加号选 Artifact,选择项目名称 war exploded,Application context 填写 /cloud_library。
  6. 启动。

这里最常翻车的是第 5 步。如果 Deployment 里没有 Artifact 可选,多半是没有在 Project Structure 里 Add Web Facet,或者没有配置 Web 资源目录。我的检查路径是:Project Structure -> Facets -> Web -> Web Resource Directory 必须指向项目里的 web 或 WebContent 目录。

如果你更习惯 Maven 方式,直接用 Maven 运行:

mvn tomcat7:run

参数说明:tomcat7:run 是 Maven 里常用来启动 Web 项目的内置目标,即使项目不是 Tomcat 7 也能启动本地容器,适合快速验证。注意许多老毕设源码没有配置 Maven 插件,需要先检查是否有 pom.xml,没有就老老实实用 IDEA 部署。

3.5 启动后验证:登录、检索、借书一条链路走通

Tomcat 启动完毕后,浏览器访问路径取决于你在 Deployment 里配的 Application context。配成 /cloud_library 就访问:

http://localhost:8080/cloud_library/

打开页面后不要只停在首页,花几分钟把核心链路走一遍:用管理员账号登录、添加一本测试图书、再注册一个读者账号、用读者账号借书、最后管理员还书。这一步能暴露出 90% 的连接或权限问题。

如果访问首页时一直转圈或报 404,先看 Tomcat 日志。IDEA 控制台里出现红色异常就要定位,最常见的是端口被占用或数据库连不上。这一部分的排查在第 5 章统一展开。

4. 代码结构拆解:三层架构里每一层改起来不迷路

4.1 包结构与分层

常见布局:

com.cloud.library ├── entity/ // 表映射的 JavaBean ├── dao/ // 数据库访问接口和实现 ├── service/ // 业务逻辑 ├── servlet/ // Controller 转发 ├── filter/ // 登录与权限拦截 ├── util/ // DBUtil、DateUtil、MD5Util └── webapp (或 WebContent) ├── admin/ ├── reader/ ├── common/ └── WEB-INF/lib

拿到源码后先看包名里的类数量。entity 里一般对应每张表,dao 里每条 SQL 方法对应一个业务操作,servlet 里每个类对应一个页面请求。如果发现所有判断都写在 JSP 里,说明项目没有分层,将来答辩会很难讲,但要改造成分层工程量大,毕设阶段不建议整体重构,最多补一层 service。

为什么推荐先看包结构?因为后续加功能时,你需要在正确的层里改代码。比如“新增图书分类”,流程就是 Servlet 接收表单参数 -> 调 Service -> DAO insert -> 返回成功提示。如果你在 JSP 里直接写 JDBC,等于把自己逼上死路,查错会非常痛苦。

4.2 数据库连接工具类 DBUtil

绝大多数 javaweb 毕设的数据库访问都是靠一个静态工具类。典型写法如下:

public class DBUtil { private static String url; private static String user; private static String password; static { try { Class.forName("com.mysql.jdbc.Driver"); Properties props = new Properties(); props.load(DBUtil.class.getClassLoader() .getResourceAsStream("jdbc.properties")); url = props.getProperty("jdbc.url"); user = props.getProperty("jdbc.username"); password = props.getProperty("jdbc.password"); } catch (Exception e) { throw new ExceptionInInitializerError("数据库配置加载失败"); } } public static Connection getConnection() throws Exception { return DriverManager.getConnection(url, user, password); } }

逻辑说明:静态块在类首次加载时执行,只加载一次驱动并读取配置;getConnection 每次调用都新建连接。参数说明:getResourceAsStream 读取的是 classpath 下的 jdbc.properties,如果你把文件放在 src 根目录或者 resources 目录,都能被读到;如果放错位置,运行时会抛空指针或找不到文件。

这种写法的问题是没有连接池,每次查询都是新建物理连接。作为毕设运行没问题,打分也认可。想在答辩里加亮点,可以把 DriverManager 换成数据库连接池,第 6 章给替换方案。

4.3 DAO 层:PreparedStatement 必须用,哪怕是查询

DAO 是 SQL 集中的地方。图书检索的典型方法:

public List<Book> searchBooks(String keyword, int page, int pageSize) throws Exception { Connection conn = DBUtil.getConnection(); String sql = "SELECT * FROM book WHERE title LIKE ? OR author LIKE ? " + "LIMIT ?, ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, "%" + keyword + "%"); ps.setString(2, "%" + keyword + "%"); ps.setInt(3, (page - 1) * pageSize); ps.setInt(4, pageSize); ResultSet rs = ps.executeQuery(); // 将所有行封装为 List<Book> }

参数说明:这里用了 LIMIT offset, pageSize 做分页。page-1 乘以 pageSize 算偏移量,如果 page 从 1 开始传,第一页就是 offset 0。关键词前后拼百分号表示模糊匹配,但 LIKE 前导通配符通常无法命中索引,数据量小可以不管,数据量大就要换全文索引方案。

一定要用 PreparedStatement 而不是 Statement,因为它是预编译的,可以防止 SQL 注入。答辩导师很可能问“怎么防止 SQL 注入”,如果你能指着这个类说“占位符问号传参,外部输入无法拼进 SQL”,这是很稳的得分点。有的源码里会看到 String sql = "select * from book where id=" + id,这种代码必须立即改掉。

4.4 Servlet 层:从 request 到 view 的转发路径

Servlet 是三层架构里的控制器。借书请求处理逻辑一般如下:

@WebServlet("/borrow") public class BorrowServlet extends HttpServlet { private BorrowService borrowService = new BorrowService(); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int bookId = Integer.parseInt(req.getParameter("bookId")); int userId = Integer.parseInt(req.getParameter("userId")); String result = borrowService.borrowBook(bookId, userId); resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write(result); } }

逻辑说明:@WebServlet 注解是 Servlet 3.0 之后支持的,不需要再去 web.xml 里手工注册,这也是老项目能简化的地方。borrowService 负责检查库存和插入借阅记录。参数说明:Integer.parseInt 只适合能确定传来数字的场景,正规点应该先判断 null 再解析,否则前端没传字段会抛 NumberFormatException。

页面跳转一般分两种:需要带数据给页面的用 req.getRequestDispatcher("/bookList.jsp").forward();借书成功后防止刷新重复提交的用 resp.sendRedirect("/index")。如果你发现源码里用了 request 转发处理“保存”操作,刷新浏览器就会重复插入借阅记录,这是一个答辩时很容易被发现的 bug。

4.5 JSP 与 JSTL:尽量减少 Java 代码写在页面里

老毕设最常见的坏味道是 JSP 顶部塞一大段<% ... %>。能够拿高分的写法是只用 EL 表达式和 JSTL 标签。图书列表页示例:

<table> <c:forEach items="${bookList}" var="b"> <tr> <td>${b.title}</td> <td>${b.author}</td> <td>${b.availableCount}</td> <td><a href="bookDetail?bookId=${b.id}">详情</a></td> </tr> </c:forEach> </table>

逻辑说明:bookList 是 Servlet 在 request.setAttribute 里放好的集合,JSTL 的 forEach 标签遍历并输出属性。${b.availableCount} 会自动调用 JavaBean 的 getAvailableCount() 方法。参数说明:如果页面显示空白,先确认 Servlet 有没有 setAttribute,再看 EL 表达式是不是属性名拼错;不要第一反应去改 JSP 编码。

如果你拿到源码后想把一个<% %>块改掉,最省事的办法是不动原来的逻辑,先把它移到 dao 或 servlet 里,JSP 里只留结果变量。改动尽量小,不出大错,这才是毕设阶段的稳妥做法。

5. 从运行到答辩:云借阅系统最常见的 5 个翻车现场

5.1 数据库连不上:驱动类找不到 vs 无法连接

现象:Tomcat 启动后,访问登录页,输入账号密码点登录,页面直接报 500,控制台打出 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,或者是 Communications link failure。

原因:ClassNotFoundException 是 JDBC 驱动 jar 没有放到 WEB-INF/lib 目录,很多源码下载包为了省空间把 jar 单独放,需要手动复制;Communications link failure 则大多是 MySQL 没启动、端口不是 3306,或者 url 里 host 配错。

解决:如果是驱动类找不到,把 mysql-connector-java 的 jar 文件复制到 WEB-INF/lib 下,重启 Tomcat;如果是连接失败,先用命令行mysql -uroot -p -e "SELECT 1;"确认 MySQL 能连通,再用 IDEA 右侧 Database 面板直接填 url 测试。最后检查驱动版本,MySQL 8 但驱动还是老版本,也会报连接超时。

提示:复制 jar 后一定要点 File -> Project Structure -> Libraries 里的刷新,或者重启 IDEA,否则项目运行时用的还是旧的 classpath。

5.2 中文乱码:请求乱码和响应乱码要分开治

现象:登录后管理员界面显示“???”或者“æµè§”,新增图书的中文标题进入数据库后乱码。

原因:有四种可能,MySQL 表字符集不是 utf8mb4、JDBC url 没带 characterEncoding=utf8、JSP 页面本身编码不是 UTF-8、Servlet 没有设置 request.setCharacterEncoding("utf-8")。

解决:这三件事必须同时做才稳妥。第一,建表语句确认是 CHARSET=utf8mb4;第二,JDBC url 加上 useUnicode=true&characterEncoding=utf8;第三,在 Servlet 的 doPost 开始处加 request.setCharacterEncoding("utf-8")。对于已经乱码的旧数据,可以在 MySQL 里执行ALTER TABLE book CONVERT TO CHARACTER SET utf8mb4修复。请按这个顺序排查,最容易漏的是第三步。

如果 JSP 页面顶部缺少<%@ page contentType="text/html;charset=UTF-8" %>,即使数据库没问题,页面渲染也会乱。这个标签看起来基础,但在老源码里经常被删掉或写错。

5.3 Tomcat 端口被占用:8080 被别的服务抢了

现象:启动 Tomcat 时 IDEA 控制台报 Port 8080 is required by Server configuration,但 Tomcat 直接闪退或首页打不开。

原因:本机另一个进程占用了 8080 端口,最常见的是之前启动的 Tomcat 没有关闭,或者装了 Oracle、某些中间件也默认用 8080。

解决:先用命令查出占用端口的进程:

netstat -ano | findstr :8080 taskkill /pid 1432 /f

在 Windows 上,第一行输出里的最后一列就是进程 PID,第二行强制结束它。如果不想杀进程,也可以把 Tomcat 的 server.xml 里的 8080 改成 8081,注意同时改访问 URL 和 IDEA Server 配置里的 HTTP port。

还有一个人容易忽略的情况:IDEA 里同时跑了多个 Tomcat 实例,第二个实例必然报端口冲突。这时停掉旧的再启动新的,比杀进程更保险。

5.4 页面 404:项目 root 路径或 Artifact 配置不对

现象:Tomcat 正常启动,但浏览器输入 http://localhost:8080/ 显示 404,或者 http://localhost:8080/cloud_library/ 无法访问。

原因:IDEA 的 Web 项目如果没有正确设置 Application Context,Deployment 里 Artifact 是空,项目就没被部署到 Tomcat 的 webapps 下。另一个可能是项目本身没有 index.jsp 或 index.html 作为欢迎页。

解决:检查 IDEA 的 Artifacts 里输出类型是否是 Exploded War,部署名是否带斜杠;再检查 web.xml 里是否配置了 welcome-file。如果都没有问题,就访问 http://localhost:8080/,能看到 Tomcat 默认页说明 Tomcat 正常,问题只出在部署名上。

这个小节的另一个常见场景:源码里项目路径叫 library,但你在 Deployment 里配的是 /cloud_library,于是所有相对路径都 404。统一用源码自带的上下文根,别自己乱改。

5.5 内存溢出:Tomcat 启动报 PermGen space

现象:运行一段时间后,页面突然报 java.lang.OutOfMemoryError: PermGen space,尤其是频繁重启项目时容易触发。

原因:非 Maven 项目大量 jar 打进 lib,Tomcat 的永久代默认偏小,JSP 编译会产生大量类常驻内存,反复热部署会放大这个问题。

解决:在 IDEA 的 Tomcat Server 配置里的 VM options 加上:

-Xms256m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m

参数说明:JDK8 里 PermGen 已经改成 Metaspace,对应参数换成 -XX:MetaSpaceSize=128m 和 -XX:MaxMetaSpaceSize=256m,但旧源码在 JDK8 上仍兼容老参数。如果加了热部署,建议关闭 IDEA 的 automatic build,改用手动点击重新部署,能减少内存碎片。

如果你在运行时会看到 java.lang.OutOfMemoryError: Java heap space,那是堆内存不够,调大 Xmx 即可。这个报错和 PermGen 是两个不同位置的内存,调参方向不一样,别混。

6. 答辩拿高分的三个改法:连接池、统计报表、自动备份

6.1 把 DriverManager 换成数据库连接池

在 Maven 项目里加入连接池依赖,或者把连接池 jar 放进 lib,再把 DBUtil 里的 getConnection 换成从 Druid 数据源取连接。示例:

static { Properties props = new Properties(); props.load(DBUtil.class.getClassLoader() .getResourceAsStream("jdbc.properties")); dataSource = DruidDataSourceFactory.createDataSource(props); } public static Connection getConnection() throws Exception { return dataSource.getConnection(); }

连接池带来的好处很直接:每次请求不再新建物理连接,而是从池里复用,答辩时可以回答“为什么项目并发能力变强”。注意 properties 文件里要加initialSize=5和maxActive=20,这组值分别控制初始连接数和最大连接数,演示时不用调太大。

6.2 加一个借阅统计报表

在管理端增加日借出量统计,SQL 如下:

SELECT DATE(borrow_date) AS day, COUNT(*) AS borrow_count FROM borrow_record WHERE borrow_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY DATE(borrow_date) ORDER BY day;

这段 SQL 返回近 7 天的借阅趋势,前端用一个简单的表格展示即可。用日期函数 GROUP BY 统计,比把所有记录拉到 Java 里数更高。答辩时说“用报表展示借阅热度”,比单纯展示增删改查更有层次。

6.3 写一个 MySQL 自动备份脚本

Windows 下可以用批处理:

@echo off set dt=%date:~0,4%%date:~5,2%%date:~8,2% mysqldump -uroot -p123456 cloud_library > backup\cloud_library_%dt%.sql

Linux 下可以用 crontab 每天凌晨执行 mysqldump。这个脚本是好加分项,体现你有数据库运维意识。注意 mysqldump 不是 mysql,不要在命令里拼错。备份产物可以同步到网盘,演示时直接在目录里确认 .sql 文件已生成就行。

6.4 演示顺序要有故事线

最后提一个答辩技巧。演示不要从登录开始,而是先打开数据库设计文档或建表 SQL,讲清楚 borrow_record 的状态字段,再打开项目展示读者借书和还书,最后演示自动备份。这样评委看到的是一条完整叙事线:数据模型、业务逻辑、工程化能力。

我自己的习惯是先把可能被问到的业务边界写进笔记:借阅库存为 0 怎么办、逾期怎么计算、权限越权怎么拦截,然后每一条都在系统里手动演示一遍。这个习惯帮我避开了很多答辩尴尬。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询