ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java图书管理系统实战:JDBC连接MySQL与避坑指南

Java图书管理系统实战:JDBC连接MySQL与避坑指南 简介一套基于 Java 与 MySQL 的图书管理系统完整源码包适合计算机相关专业学生在课程设计或期末大作业中直接使用也适合需要 Java 项目实战练习的初学者参考。项目原本是一位大三学生的期末大作业经导师指导后获得 99 分高分代码结构完整、注释清晰小白也能按文档指引顺利配置运行。压缩包共 32 个文件约 530KB其中包含 9 个 java 源代码文件、18 个编译好的 class 文件、1 个 sql 数据库脚本以及 eclipse 工程配置文件和 docx 说明文档sql 脚本可直接导入 MySQL 建库建表project/classpath 等文件可快速导入开发环境运行docx 文档则便于了解项目设计思路与操作方法。目前已有 178 人浏览学习作为课程设计或毕业设计参考具有较高性价比。通过这份资源读者不仅能拿到可运行的图书管理业务代码还能结合数据库脚本与设计文档系统理解图书信息管理、借阅归还等功能的实现流程节省自主搭建环境与编写文档的时间。1. 课程设计里的常客值得你花一个周末把它跑透几乎每个学 Java 的人都会在某次课程设计或毕业设计里撞见它。这个标题里的「图书管理系统」通常是一个 JSP Servlet JDBC MySQL 的教材级项目打包形式是 Java 源码加一份 MySQL 数据库导出文件。你下载到的不是某个商业产品而是一份能跑通借书、还书、图书检索、读者管理的完整示例代码。对刚学完 JavaSE 的人来说它是第一个能把「前端页面 后端逻辑 数据库表」串起来的真实工程对准备面试的人来说它是理解 JDBC 连接管理与 SQL 实践的最短路径。这份压缩包值不值得你打开取决于你的目标。如果你是拿来交课程设计它几乎开箱即用如果你是试图在生产环境里部署那它注定会让你失望——这本身就是个教学项目。我下面按「先读懂结构、再搭环境、最后动手改」的顺序讲把连接 MySQL 时的常见翻车点一并给你盘清楚。2. 拆开 ZIP 之后看懂 Java 源码的分层与数据流2.1 典型三层结构UI、业务、数据访问的职责边界解压这套 Java 图书管理系统后你会发现它的目录习惯性地分成三类包控制层Servlet 或 Action、业务层Service、数据访问层DAO。这是 Java Web 课程设计里最常见的「贫血模型」分层也叫 MVC 的变体。它的核心规则是JSP 页面只负责展示和收集参数Servlet 负责接收请求并调用 ServiceService 里写校验和业务规则DAO 里只写 SQL 和 JDBC 操作。// 数据访问层的典型写法几乎所有图书管理系统都长这样 public class BookDAO { // 查询所有图书 public ListBook findAll() { ListBook list new ArrayList(); String sql SELECT id, name, author, price, stock FROM book; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { Book book new Book(); book.setId(rs.getInt(id)); book.setName(rs.getString(name)); book.setAuthor(rs.getString(author)); book.setPrice(rs.getDouble(price)); book.setStock(rs.getInt(stock)); list.add(book); } } catch (SQLException e) { e.printStackTrace(); } return list; } }这段代码写得很直白PreparedStatement 做参数化查询能防 SQL 注入是这套源码里值得你重点学的部分。注意它用了try-with-resources语法这是 JDK 7 之后的特性说明这份源码至少是 Java 8 时代的产物。DBUtil 是它自己的数据库连接工具类运行前你会和它反复打交道。2.2 数据流里藏着 MySQL 表设计的全部秘密把整个系统的数据流画出来你会发现它只围绕四个核心表转图书表、读者表、借阅记录表、管理员表。MySQL 数据库导出文件里除了建表语句通常还有INSERT初始数据这让系统一启动就有几十本书可以查。借阅记录表的字段设计最值得看——它一般存borrow_date和return_date两组日期但很少做超期计算这是课程设计的正常水准不影响你的答辩。-- 借阅记录表的核心结构注意外键关联关系 CREATE TABLE borrow_record ( id INT PRIMARY KEY AUTO_INCREMENT, book_id INT NOT NULL, reader_id INT NOT NULL, borrow_date DATETIME DEFAULT CURRENT_TIMESTAMP, return_date DATETIME, is_returned TINYINT DEFAULT 0, CONSTRAINT fk_borrow_book FOREIGN KEY (book_id) REFERENCES book(id), CONSTRAINT fk_borrow_reader FOREIGN KEY (reader_id) REFERENCES reader(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这张表决定了系统最重要的业务逻辑is_returned字段是 0 表示借出未还是 1 表示已归还。你做还书操作时Service 层要同时执行 UPDATE 这条记录和把 book 表的 stock 加一这两步必须放在同一个事务里否则会出现「书还了但库存没变」的脏数据。MySQL 默认的ENGINEInnoDB支持事务你如果发现系统里还书后库存对不上基本可以断定 Service 层没加事务控制。2.3 先跑通再阅读把源码当教材的三种用法拿到这套源码别急着改先按「黑盒——白盒——重构」三步走。黑盒阶段把项目部署起来在页面上添加一本图书、借出一本、还回一本观察 URL 参数怎么变化。白盒阶段在 IDEA 里打断点从 JSP 页面 Form 表单的action属性开始追踪一次完整的借书请求。重构阶段把 DBUtil 里的 JDBC 连接改成连接池把 JSP 里的 Java 片段抽取到 Servlet——这两步是你在面试时能拿得出手的亮点。3. 从零搭建运行环境JDK、MySQL 与导入 SQL 的完整路径3.1 JDK 和 MySQL 的版本匹配别被默认安装带偏这套源码是课程设计水准它对 JDK 版本极度敏感。常见做法是安装 JDK 1.8也就是 Java 8这是绝大多数图书管理系统源码最稳妥的运行版本。JDK 11 或 17 虽然能编译大多数字节码但会遇到两个头疼的问题一是tomcat版本不匹配导致容器启动失败二是某些源码里用了过时的AccessBridge类在高版本 JDK 里已经被删除。MySQL 建议装 5.7 或 8.0两者在导入 SQL 时的表现不同后面我会专门说。# Linux 环境下的检查命令Windows 用户直接在 cmd 里执行 java -version mysql --versionjava -version显示出来如果是以 1.8 开头比如1.8.0_291说明 JDK 版本正确如果显示openjdk version 17你就该思考是换 JDK 还是改源码。其实改源码也不难把 pom.xml 里或 lib 目录下的 Tomcat 依赖升到 9.0 以上大概率能跑。但我的习惯是装一个 JDK 8省掉后面所有不确定性毕竟项目本身的诉求是「先跑起来」。3.2 在 Windows 上装 MySQL 8.0记住 root 密码和端口就成功一半MySQL 8.0 的安装器下载之后选 Server only 即可不需要装 Workbench 和 Shell。安装过程中最关键的一步是设置root用户的密码这套系统所带的 SQL 脚本通常默认用root / 123456连接数据库你在安装时最好设置成同样的值否则后面改代码反而更麻烦。端口默认 3306 不要动源码里的连接 URL 写死了这个端口。# 用命令行客户端验证 MySQL 服务是否可用 mysql -uroot -p123456 -h127.0.0.1 -P3306注意-h127.0.0.1不能省略成-hlocalhost。MySQL 8.0 里两者解析方式不同localhost会走 Unix socket 或 Windows 命名管道而源码里的 JDBC 驱动通常用 TCP 连接127.0.0.1。你如果在这步遇到ERROR 2002 (HY000)八成是 MySQL 服务没启动去 Windows 服务管理器或执行net start mysql80就行。3.3 使用 Navicat 或命令行导入 SQL 文件两种路径都不复杂拿到.zip里的 SQL 文件它的名字一般叫book_manager.sql或类似。导入方式有两种一种是用 Navicat 右键数据库运行 SQL 文件另一种是用 MySQL 命令行重定向。# 命令行导入Windows 和 Linux 通用 mysql -uroot -p123456 D:/book_manager.sql导入成功后执行SHOW TABLES;查看是否有book、reader、admin等表。遇到Unknown database错误说明 SQL 文件里没有CREATE DATABASE语句你需要手动先建一个数据库再导入。CREATE DATABASE IF NOT EXISTS db_library DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE db_library;这条建库语句建议放在 src 目录下的db.sql里同时也是给项目一个明确的字符集约定。源码中原生的 SQL 文件如果没写库名导入时你要注意把USE语句补上否则数据会落到默认数据库里JDBC 连接时找不到表。3.4 IDE 导入项目IDEA 和 Eclipse 的差异化处理这套源码常见的是 Eclipse 工程格式目录下会有.classpath和.project文件。IDEA 导入时选择 Open 而不是 New选择项目根目录IDEA 会自动识别。如果你的源码包里没有.classpath而是 lib 文件夹里有一堆 Jar那就要手动把 lib 下的 jar 加入依赖。# 查看 lib 目录内容Windows 命令 dir liblib目录里通常有mysql-connector-java-8.0.xx.jar和jstl.jar。前者的版本要和你的 MySQL 版本配套如果用 MySQL 8.0 但 jar 是 5.1 后缀会报Public Key Retrieval is not allowed错误解决方法是把连接 URL 加上allowPublicKeyRetrievaltrue或者干脆换新版本的 Connector/J。4. 修改关键配置从连接 MySQL 到首次启动的必经之路4.1 DBUtil 里的连接参数改这三处就能连通数据库每个图书管理系统都有一个DBUtil.java或JdbcUtils.java里面写死了 JDBC 驱动的加载和连接获取方式。你只需要关心三个参数数据库地址、用户名、密码。// 数据库连接工具类核心配置就这几行 public class DBUtil { private static final String URL jdbc:mysql://127.0.0.1:3306/db_library?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private static final String USERNAME root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USERNAME, PASSWORD); } }如果你用的是 MySQL 5.7驱动类名可以写成com.mysql.jdbc.Driver如果你用的是 MySQL 8.0必须写成com.mysql.cj.jdbc.Driver。serverTimezoneAsia/Shanghai是 MySQL 8.0 的必填项不填会报时区错误。useSSLfalse建议保留课程设计环境里没人配置证书开 SSL 反而增加握手失败概率。4.2 启动 Tomcat 前检查 web.xml路径映射决定了 URL 长什么样JSP 页面里的超链接和表单提交地址都对应web.xml里的 Servlet 映射。这套源码的 Servlet 一般用注解WebServlet(/BookServlet)方式配置你在页面上看到的跳转是book_manager/BookServlet?actionfindAll这种格式。welcome-file-list welcome-filelogin.jsp/welcome-file /welcome-file-listwelcome-file决定了浏览器访问http://localhost:8080/项目名/时默认打开哪个页面通常是登录页。如果你改乱了路径最常见的错误是 404 或 500。404 是路径写错、Servlet 没映射上500 大多是 SQL 或者数据库连接异常看 Tomcat 日志catalina.out里的Caused by一层层翻到最底层就能定位问题。4.3 页面乱码与搜索框失效项目运行参数里两个隐形雷区JSP 页面顶部会有pageEncodingUTF-8MySQL 表结构也设置了utf8mb4字符集但用户添加的图书记录在页面上显示为问号这是典型的「三重编码不一致」问题。解决路径是保证JSP 文件编码 HTTP 请求编码 数据库连接编码 MySQL 表字符集四个环节统一。// 在 Servlet 里强制设置请求编码放在 doGet/doPost 里第一行 request.setCharacterEncoding(UTF-8); response.setCharacterEncoding(UTF-8); response.setContentType(text/html;charsetUTF-8);搜索功能失效比你想象得常见。很多课程设计源码的搜索是用LIKE拼 SQL但字段类型是int或比较的字段名写错。检查 DAO 里的WHERE子句确认它匹配的表字段和搜索表单namekeyword一致。如果页面提交的 keyword 传不到后端多半是表单没有methodpost或者 input 的name属性拼写错误。5. Java 图书管理系统避坑指南5 个高频故障的定位与修复5.1 现象启动 Tomcat 时端口被占用原因上一次服务未关闭解决用命令行查杀用 IDEA 或 Eclipse 启动项目时报Port 8080 was already in use。原因通常是上次运行没正常关闭Java 进程仍在后台占用端口。打开命令行执行netstat -ano | findstr 8080记下最后一列 PID然后taskkill /F /PID 该PID。遇到杀不干净的情况去任务管理器按 CPU 排序找java.exe进程手动结束。5.2 现象控制台报ClassNotFoundException: com.mysql.cj.jdbc.Driver原因jar 包没打入部署目录解决重新添加依赖这个错误出现次数最多尤其是在把源码导入新 IDE 时。Eclipse 里 lib 下的 jar 引用了但没进WEB-INF/lib目录IDEA 里则可能是 jar 没 Artifacts。解决方法是打开项目结构找到 Artifacts 选项把 MySQL Connector/J 添加到WEB-INF/lib下然后重新部署。判断 jar 是否成功的标准是展开部署目录能看到.jar文件而不是只在代码里能 import。5.3 现象页面能打开但登录时 500 SQLException原因连到了空的数据库实例解决确认 SQL 脚本导入到了正确的库登录报错信息指向Table db_library.admin doesnt exist。这说明 JDBC 连接 URL 里的库名和你导入 SQL 的目标库名不一致。你在 Navicat 左侧能看到建好的库双击展开表如果表清单为空说明脚本根本没执行成功。重新执行导入导入完执行USE db_library; SHOW TABLES;确认表存在。5.4 现象MySQL 8.0 连接时报Public Key Retrieval is not allowed原因连接参数未开权限解决修改 URL 后缀MySQL 8.0 默认使用caching_sha2_password认证JDBC 首次连接时要求获取服务器的公钥。在连接 URL 末尾追加allowPublicKeyRetrievaltrue即可这个参数只影响首次握手不影响安全性。另一个备选方案是把 root 用户的认证插件改成mysql_native_password但会改动 MySQL 配置不如改 URL 方便。5.5 现象图书列表能显示但新增图书报错提示Data truncation原因表单字段超长或类型不匹配解决检查前端 input 与表结构页面录入的 ISBN 是 20 位但book表的isbn字段定义是VARCHAR(13)插入时 MySQL 会拒绝并报Data truncation。解决方法是修改表结构的字段长度ALTER TABLE book MODIFY COLUMN isbn VARCHAR(30);这类操作不会丢数据是课程设计阶段最常做的事。遇到价格字段报错则检查表单是否传了空字符串把 JSP 端的 value 做一次空值判断或用parseDouble捕获异常。6. 用 mysqldump 做备份把课程设计变成可维护的小系统6.1 数据备份的日常操作一条命令解决保命问题一套图书管理系统最值钱的不是源码是里面录进去的图书和借阅数据。期末交完作业数据库里的数据可能还要继续用。最省事的备份方式是mysqldump它在 MySQL 安装目录的 bin 文件夹里。# 备份整个库到自定义路径含建库语句 mysqldump -uroot -p123456 --default-character-setutf8mb4 db_library D:/backup/db_library_20250101.sql恢复时用我第三章讲到的导入命令即可。注意--default-character-setutf8mb4这个参数是血泪经验换来的不加它备份出来的文件在恢复时会因为字符集不一致产生乱码。6.2 给源码补一个定时备份任务Windows 任务计划程序手工备份总会忘你可以让 Windows 任务计划程序每天凌晨自动执行备份脚本。echo off set BACKUP_DIRD:\backup set FILE_NAMEdb_library_%date:~0,4%%date:~5,2%%date:~8,2%.sql mysqldump -uroot -p123456 db_library %BACKUP_DIR%\%FILE_NAME%把这段存为backup.bat在任务计划程序里新建任务触发器选每天操作选启动程序并指向这个 bat。注意%date%的格式依赖系统区域设置中文 Windows 下日期带星期脚本里截取的位置要微调。6.3 从复用走向改造JDBC 连接池与事务控制在项目里的落地备份解决的是数据安全再往前走一步就要改造代码结构。把 DBUtil 里的DriverManager.getConnection替换成 HikariCP 连接池是这门课程设计最值得做的升级之一。改动很小引入HikariCP.jar写一个配置类读取池参数然后让 DBUtil 返回DataSource.getConnection()。// 数据库连接池的核心配置比 DriverManager 高效得多 HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://127.0.0.1:3306/db_library?useSSLfalseserverTimezoneAsia/Shanghai); config.setUsername(root); config.setPassword(123456); config.setMaximumPoolSize(10); config.setMinimumIdle(2); config.setConnectionTimeout(30000); HikariDataSource ds new HikariDataSource(config);连接池改造后借书和还书的 Service 层要加事务conn.setAutoCommit(false)、业务执行完conn.commit()、异常时conn.rollback()。做到这一步你的系统在数据一致性上就能去面试时讲了——MySQL 的事务隔离级别、连接池的maximumPoolSize调多少合适都是 Java 面试题里被问烂的点。关掉项目前我的习惯是顺手把 MySQL 的自动提交状态改回autocommit1避免下次打开工程时事务状态不对导致脏读。这个过程里踩过的每一个ClassNotFoundException、每一次Data truncation都是你把这套系统的每一行代码真正吃透的证据。带着这套改过的源码去面试或去答辩比抱着整包 ZIP 跑一遍强得多——希望帮到你。本文还有配套的精品资源点击获取
返回列表