Java课程设计实验报告
项目名称:基于Java Swing的图书管理系统
摘要
本报告详细记录了“基于Java Swing的图书管理系统”的课程设计过程,该系统旨在为小型图书馆或个人提供一个简单、高效、图形化的图书信息管理平台,系统采用Java语言作为开发语言,利用Swing组件库构建用户界面,使用MySQL作为后台数据库存储数据,并通过JDBC技术实现前后端数据交互。
系统实现了用户登录、图书信息的增、删、改、查(CRUD)、用户管理以及借阅记录查询等核心功能,在设计过程中,我们遵循了模块化、面向对象的设计原则,保证了代码的可读性、可维护性和可扩展性,通过本次课程设计,我们不仅巩固了Java编程、数据库操作和GUI设计的理论知识,更提升了分析实际问题、设计解决方案和团队协作的综合能力。

Java;Swing;MySQL;JDBC;图书管理系统;课程设计
1 项目背景与意义
随着信息技术的飞速发展,传统的纸质图书管理方式已无法满足现代图书馆高效、精准的管理需求,手动管理图书信息不仅效率低下,而且容易出错,查询和统计工作也极为繁琐,开发一个功能完善、操作便捷的图书管理系统具有重要的现实意义。
本课程设计项目旨在利用我们所学Java编程知识,特别是面向对象思想和GUI编程技术,结合数据库技术,设计并实现一个功能完备的图书管理系统,该系统不仅能减轻图书管理员的工作负担,还能为读者提供更友好的交互体验,是理论知识与实践应用相结合的绝佳范例。
2 设计目标
-
功能性目标:

- 实现管理员和读者的多角色登录功能。
- 实现图书信息的录入、修改、删除和查询功能。
- 实现读者信息的录入、修改、删除和查询功能。
- 实现图书的借阅和归还功能,并记录借阅历史。
- 提供一个直观、易用的图形用户界面。
-
技术性目标:
- 熟练运用Java Swing组件进行GUI界面设计与布局。
- 掌握JDBC技术,实现Java程序与MySQL数据库的连接与数据操作。
- 运用MVC(Model-View-Controller)设计思想,合理划分系统模块,降低耦合度。
- 编写结构清晰、注释规范的代码,养成良好的编程习惯。
需求分析
1 功能需求
根据系统设计目标,我们将系统功能划分为以下几个模块:
-
登录模块:
- 用户输入用户名和密码。
- 系统验证用户身份,区分管理员和普通读者。
- 验证成功后,跳转至相应的功能主界面;失败则提示错误信息。
-
图书管理模块(管理员):

- 添加图书: 输入图书的ISBN、书名、作者、出版社、库存数量等信息,保存到数据库。
- 修改图书: 根据图书ID或书名查询到图书信息后,可对其信息进行修改并更新数据库。
- 删除图书: 根据图书ID或书名查询到图书信息后,可将其从数据库中删除(需处理外键约束)。
- 查询图书: 支持按书名、作者、ISBN等条件进行模糊查询和精确查询,并以表格形式展示结果。
-
读者管理模块(管理员):
- 添加读者: 输入读者的学号/工号、姓名、联系方式等信息,保存到数据库。
- 修改读者: 根据读者ID查询到读者信息后,可进行修改。
- 删除读者: 根据读者ID删除读者信息(需处理外键约束)。
- 查询读者: 支持按姓名、学号/工号等条件查询读者信息。
-
借阅管理模块(管理员和读者):
- 借阅图书(管理员): 输入读者ID和图书ID,系统检查读者借阅上限和图书库存,若满足条件则创建借阅记录,并减少图书库存。
- 归还图书(管理员): 输入借阅记录ID或读者和图书信息,执行归还操作,增加图书库存,并更新借阅记录的归还状态。
- 查询借阅记录(管理员): 查看所有读者的借阅历史,包括已归还和未归还的记录。
- 查询我的借阅(读者): 读者登录后只能查看自己的借阅记录。
2 非功能需求
- 性能需求: 系统响应时间应在用户可接受的范围内(如查询操作应在2秒内完成)。
- 易用性需求: 界面布局清晰,操作流程简单直观,用户无需复杂培训即可上手。
- 可靠性需求: 系统应能稳定运行,具备一定的数据备份和恢复机制(如定期备份数据库)。
- 安全性需求: 用户密码应加密存储在数据库中,防止泄露,不同角色拥有不同的操作权限。
系统设计
1 系统总体架构
本系统采用经典的三层架构模式,将系统分为表现层、业务逻辑层和数据访问层,如图3-1所示。
- 表现层: 由Java Swing GUI界面构成,负责与用户进行交互,接收用户输入并展示处理结果。
- 业务逻辑层: 负责处理系统的核心业务逻辑,如用户验证、借阅规则判断、数据校验等,它调用数据访问层获取数据,并将处理结果返回给表现层。
- 数据访问层: 负责与MySQL数据库进行交互,执行SQL语句,完成数据的增、删、改、查操作。
这种分层结构使得各层职责明确,降低了模块间的耦合度,便于系统的维护和扩展。
(此处可以画一个简单的三层架构图)
2 数据库设计
根据需求分析,我们设计了以下数据表:
-
用户表 (t_user) | 字段名 | 数据类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | |
user_id|INT|PRIMARY KEY, AUTO_INCREMENT| 用户ID | |username|VARCHAR(50)|UNIQUE, NOT NULL| 用户名 | |password|VARCHAR(255)|NOT NULL| 密码(MD5加密) | |role|VARCHAR(20)|NOT NULL| 角色('admin' 或 'user') | |name|VARCHAR(50)| | 姓名 | -
图书表 (t_book) | 字段名 | 数据类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | |
book_id|INT|PRIMARY KEY, AUTO_INCREMENT| 图书ID | |isbn|VARCHAR(20)|UNIQUE, NOT NULL| ISBN号 | |title|VARCHAR(100)|NOT NULL| 书名 | |author|VARCHAR(100)| | 作者 | |publisher|VARCHAR(100)| | 出版社 | |stock|INT|DEFAULT 0| 库存数量 | -
借阅记录表 (t_borrow) | 字段名 | 数据类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | |
borrow_id|INT|PRIMARY KEY, AUTO_INCREMENT| 借阅记录ID | |user_id|INT|FOREIGN KEY (t_user.user_id)| 用户ID | |book_id|INT|FOREIGN KEY (t_book.book_id)| 图书ID | |borrow_date|DATE|NOT NULL| 借出日期 | |due_date|DATE|NOT NULL| 应还日期 | |return_date|DATE| | 实际归还日期(NULL表示未归还) |
(此处可以画出E-R图)
3 类设计
根据面向对象思想,我们将系统功能封装在不同的类中。
DBUtil.java: 数据库工具类,负责加载驱动、获取连接、关闭资源等。User.java: 用户实体类,对应t_user表。Book.java: 图书实体类,对应t_book表。BorrowRecord.java: 借阅记录实体类,对应t_borrow表。UserDao.java: 用户数据访问对象,处理用户相关的数据库操作。BookDao.java: 图书数据访问对象,处理图书相关的数据库操作。BorrowDao.java: 借阅数据访问对象,处理借阅相关的数据库操作。LoginFrame.java: 登录界面。MainFrame.java: 主界面,根据用户角色显示不同功能菜单。BookManagePanel.java: 图书管理面板。UserManagePanel.java: 读者管理面板。BorrowPanel.java: 借阅管理面板。
详细设计与实现
1 关键技术与难点
-
Swing界面布局:
- 难点: 复杂界面的组件排列和响应式布局。
- 解决方案: 综合使用
BorderLayout、FlowLayout、GridLayout和GridBagLayout等布局管理器,对于复杂的表格和输入表单,优先使用GridBagLayout以实现精确控制。
-
数据库连接与事务处理:
- 难点: 保证数据操作的原子性,例如借书操作需要同时更新
t_borrow表和t_book表的库存。 - 解决方案: 使用
Connection对象的setAutoCommit(false)方法手动开启事务,在所有操作成功后调用commit()提交,若发生异常则调用rollback()回滚。
// 伪代码示例 Connection conn = DBUtil.getConnection(); try { conn.setAutoCommit(false); // 1. 更新图书库存 bookDao.updateStock(conn, bookId, -1); // 2. 添加借阅记录 borrowDao.addBorrowRecord(conn, record); conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚事务 e.printStackTrace(); } finally { conn.setAutoCommit(true); // 恢复默认提交模式 DBUtil.closeConnection(conn); } - 难点: 保证数据操作的原子性,例如借书操作需要同时更新
-
表格数据动态更新:
- 难点: 在
JTable中实时显示数据库中的最新数据。 - 解决方案: 使用
DefaultTableModel作为JTable的数据模型,每次查询或操作数据后,先清空DefaultTableModel,然后将查询结果重新填充到模型中,并调用fireTableDataChanged()方法通知表格刷新。
// 伪代码示例 DefaultTableModel model = (DefaultTableModel) jTable.getModel(); model.setRowCount(0); // 清空表格 List<Book> books = bookDao.queryAllBooks(); for (Book book : books) { model.addRow(new Object[]{book.getBookId(), book.getTitle(), book.getAuthor(), book.getStock()}); } - 难点: 在
2 核心代码片段
DBUtil.java - 获取数据库连接
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/library_db?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "your_password";
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
public static void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
BookDao.java - 查询图书方法
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class BookDao {
public List<Book> queryBooksByKeyword(String keyword) {
List<Book> books = new ArrayList<>();
String sql = "SELECT * FROM t_book WHERE title LIKE ? OR author LIKE ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "%" + keyword + "%");
pstmt.setString(2, "%" + keyword + "%");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
Book book = new Book();
book.setBookId(rs.getInt("book_id"));
book.setIsbn(rs.getString("isbn"));
book.setTitle(rs.getString("title"));
book.setAuthor(rs.getString("author"));
book.setPublisher(rs.getString("publisher"));
book.setStock(rs.getInt("stock"));
books.add(book);
}
} catch (SQLException e) {
e.printStackTrace();
}
return books;
}
// ... 其他增删改方法
}
系统测试
1 测试环境
- 硬件环境: Intel Core i5, 16GB RAM
- 操作系统: Windows 11
- 软件环境:
- JDK 17
- IntelliJ IDEA 2025.1
- MySQL 8.0
- MySQL Connector/J 8.0
2 测试用例
| 测试模块 | 测试用例编号 | 测试描述 | 输入数据 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|---|---|
| 登录 | TC-Login-01 | 管理员成功登录 | admin / 123456 | 登录成功,进入管理员主界面 | 登录成功,进入管理员主界面 | 通过 |
| TC-Login-02 | 密码错误 | user / wrongpass | 提示“用户名或密码错误” | 提示“用户名或密码错误” | 通过 | |
| 图书查询 | TC-Book-01 | 按书名模糊查询 | 输入“Java” | 显示所有书名包含“Java”的图书 | 显示所有书名包含“Java”的图书 | 通过 |
| 图书借阅 | TC-Borrow-01 | 成功借阅有库存的图书 | reader1 / book1 | 创建借阅记录,book1库存减1 | 创建借阅记录,book1库存减1 | 通过 |
| TC-Borrow-02 | 借阅库存为0的图书 | reader1 / book2 | 提示“图书库存不足” | 提示“图书库存不足” | 通过 |
3 测试结果分析
经过上述测试,系统的主要功能均按预期正常工作,测试结果表明,系统在逻辑处理、数据一致性和用户交互方面表现良好,未发现严重的功能性缺陷,一些UI细节(如字体大小、对齐方式)在后续版本中可以进一步优化。
总结与展望
1 项目总结
本次Java课程设计成功地实现了一个基于Java Swing和MySQL的图书管理系统,通过该项目,我们全面地实践了Java面向对象编程、GUI设计、数据库操作等核心知识点,在开发过程中,我们遇到了诸如事务处理、界面布局等技术难题,但通过查阅资料、团队讨论和不懈努力,最终都得到了有效解决,这不仅锻炼了我们独立解决问题的能力,也让我们深刻体会到软件工程中“分析-设计-编码-测试”这一完整流程的重要性。
2 不足之处
- 安全性有待加强: 目前系统功能较为简单,未实现更高级的安全机制,如SQL注入防护(虽然使用了
PreparedStatement,但可以进一步封装)、权限细化(如管理员A不能删除管理员B的数据)等。 - 用户体验可优化: 界面设计较为朴素,可以引入更美观的UI皮肤或自定义组件,部分操作流程可以更加简化,例如支持扫码借阅。
- 功能不够完善: 缺少图书分类、逾期罚款、数据统计与报表生成等高级功能。
3 未来展望
在未来的版本中,我们可以从以下几个方面对系统进行升级和完善:
- 引入Web技术: 将系统从桌面应用升级为B/S(浏览器/服务器)架构,使用Spring Boot + Vue.js等技术栈,使其可以通过网络访问,适用范围更广。
- 增强功能模块: 增加图书推荐系统、用户评论、在线预约等功能,提升系统的智能化和用户友好度。
- 优化性能: 对于数据量大的情况,可以引入缓存机制(如Redis)和数据库索引优化查询性能。
- 部署与运维: 学习使用Docker进行容器化部署,使系统的部署和迁移更加便捷。
参考文献
[1] 赵满柱, 刘慧. Java程序设计[M]. 北京: 高等教育出版社, 2025. [2] Cay S. Horstmann. Java核心技术 卷I:基础知识(第11版)[M]. 周立, 译. 北京: 机械工业出版社, 2025. [3] Ben Forta. MySQL必知必会[M]. 钟鸣, 刘晓霞, 译. 北京: 人民邮电出版社, 2025. [4] (可选) 在线技术文档, 如Oracle官方文档、MySQL官方文档等。
附录:核心代码清单
src/main/java/com/yourpackage/目录下的所有Java源文件。DBUtil.javaentity/User.java,entity/Book.java,entity/BorrowRecord.javadao/UserDao.java,dao/BookDao.java,dao/BorrowDao.javaui/LoginFrame.java,ui/MainFrame.java- ... (其他所有UI和DAO类)
报告撰写人: [你的姓名] 学 号: [你的学号] 指导教师: [指导教师姓名] 完成日期: [年/月/日]