博主介绍:✌全网粉丝阅读量30W+,CSDN特邀作者、博客专家、CSDN新星计划导师,博客之星、平台优质作者、专注于Java技术领域和项目实战✌
🍅文末获取源码联系🍅
一、前言介绍
随着信息技术的飞速发展,传统的手工图书管理方式已难以满足现代图书馆高效、精准的管理需求。图书管理系统作为信息管理系统(MIS)的典型应用,旨在通过计算机技术实现图书信息的数字化存储、智能化检索与规范化管理,从而大幅提升工作效率,降低人工操作失误率。
本项目基于 Java Swing 图形用户界面框架与 MySQL 关系型数据库,设计并实现了一套功能完善的桌面端图书管理系统。系统支持图书信息的增删查改、多条件组合检索以及数据的持久化存储,界面简洁直观,操作便捷高效。通过本项目的开发,不仅加深了对 Java GUI 编程和 JDBC 数据库访问技术的理解,也实践了软件工程中模块化设计、异常处理与人机交互设计的基本思想,为后续从事企业级应用开发奠定了坚实基础。
二、主要技术
| 技术领域 | 具体技术 | 说明 |
|---|---|---|
| 开发语言 | Java SE | 采用 Java 标准版进行开发,具备良好的跨平台特性 |
| GUI 框架 | Java Swing | 使用 JFrame、JTable、JPanel 等组件构建桌面图形界面,采用 BorderLayout、GridLayout、FlowLayout 混合布局管理 |
| 数据库 | MySQL | 选用 MySQL 8.0+ 作为后端关系型数据库,存储图书基本信息 |
| 数据库连接 | JDBC (Java Database Connectivity) | 通过 DriverManager 获取连接,使用 PreparedStatement 执行参数化 SQL,防止 SQL 注入 |
| 数据模型 | DefaultTableModel |
自定义不可编辑的表格模型,实现图书数据在界面的展示与刷新 |
| 驱动程序 | mysql-connector-j |
MySQL 官方 JDBC 驱动,支持 com.mysql.cj.jdbc.Driver |
| 异常处理 | try-with-resources + 自定义弹窗 |
统一捕获 SQLException,通过 JOptionPane 向用户反馈友好提示 |
| 系统特性 | 多条件模糊查询、唯一性约束、数据校验 | 支持书名/作者/ISBN 组合检索,ISBN 设置唯一索引防止重复录入 |
三、 功能截图
3.1 引入mysql支持的jar包

3.2 代码运行初始化界面

3.3 添加图书功能
点击添加图书按钮, 显示图书添加成功对话框

添加三本图书,展示图书列表

数据库查询,展示图书列表

3.4 查询图书功能
根据书名查询

支持模糊查询

如果查询没有图书,需要展示提示信息!

根据作者查询图书信息

根据ISBN查询图书信息

3.5 删除图书功能

四、代码参考
数据库配置(请根据你的环境修改)
java
private static final String DB_URL = "jdbc:mysql://localhost:3306/library_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
private static final String DB_USER = "root"; // 替换为你的用户名
private static final String DB_PASSWORD = "123456"; // 替换为你的密码
初始化数据库:创建 books 表(如果不存在)
java
private void initializeDatabase() {
String createTableSQL = "CREATE TABLE IF NOT EXISTS books (\n" +
" id INT AUTO_INCREMENT PRIMARY KEY,\n" +
" title VARCHAR(255) NOT NULL,\n" +
" author VARCHAR(255) NOT NULL,\n" +
" isbn VARCHAR(50) UNIQUE NOT NULL\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
Statement stmt = conn.createStatement()) {
stmt.execute(createTableSQL);
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "❌ 数据库初始化失败:\n" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
Java Swing 初始化图形用户界面的定义
java
private void initializeGUI() {
setTitle("📚 图书管理系统 - MySQL + JDBC 版");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(900, 650);
setLocationRelativeTo(null);
String[] columns = {"序号", "书名", "作者", "ISBN"};
tableModel = new DefaultTableModel(columns, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
bookTable = new JTable(tableModel);
bookTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// 添加图书面板
JPanel inputPanel = new JPanel(new GridLayout(4, 2, 5, 5));
inputPanel.setBorder(BorderFactory.createTitledBorder("添加新书"));
titleField = new JTextField();
authorField = new JTextField();
isbnField = new JTextField();
inputPanel.add(new JLabel("书名:"));
inputPanel.add(titleField);
inputPanel.add(new JLabel("作者:"));
inputPanel.add(authorField);
inputPanel.add(new JLabel("ISBN:"));
inputPanel.add(isbnField);
JButton addButton = new JButton("✅ 添加图书");
addButton.addActionListener(e -> addBookToDB());
inputPanel.add(new JLabel());
inputPanel.add(addButton);
// 查询面板
JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5));
searchPanel.setBorder(BorderFactory.createTitledBorder("多条件查询(留空表示不限)"));
searchTitle = new JTextField(12);
searchAuthor = new JTextField(12);
searchIsbn = new JTextField(12);
searchPanel.add(new JLabel("书名:"));
searchPanel.add(searchTitle);
searchPanel.add(new JLabel("作者:"));
searchPanel.add(searchAuthor);
searchPanel.add(new JLabel("ISBN:"));
searchPanel.add(searchIsbn);
JButton searchButton = new JButton("🔍 查询");
JButton deleteButton = new JButton("🗑️ 删除选中");
JButton refreshButton = new JButton("🔄 刷新");
searchButton.addActionListener(e -> performSearch());
deleteButton.addActionListener(e -> deleteSelectedBook());
refreshButton.addActionListener(e -> loadBooksFromDB());
searchPanel.add(searchButton);
searchPanel.add(deleteButton);
searchPanel.add(refreshButton);
setLayout(new BorderLayout());
add(new JScrollPane(bookTable), BorderLayout.CENTER);
add(inputPanel, BorderLayout.WEST);
add(searchPanel, BorderLayout.SOUTH);
}
从数据库加载所有图书
java
private void loadBooksFromDB() {
tableModel.setRowCount(0);
String sql = "SELECT id, title, author, isbn FROM books ORDER BY id";
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
int id = rs.getInt("id");
String title = rs.getString("title");
String author = rs.getString("author");
String isbn = rs.getString("isbn");
tableModel.addRow(new Object[]{id, title, author, isbn});
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "❌ 加载图书失败:\n" + e.getMessage(), "数据库错误", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
添加图书到数据库
java
// 添加图书到数据库
private void addBookToDB() {
String title = titleField.getText().trim();
String author = authorField.getText().trim();
String isbn = isbnField.getText().trim();
if (title.isEmpty() || author.isEmpty() || isbn.isEmpty()) {
JOptionPane.showMessageDialog(this, "❌ 所有字段不能为空!", "输入错误", JOptionPane.WARNING_MESSAGE);
return;
}
String sql = "INSERT INTO books (title, author, isbn) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, title);
pstmt.setString(2, author);
pstmt.setString(3, isbn);
pstmt.executeUpdate();
JOptionPane.showMessageDialog(this, "✅ 图书添加成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
clearInputFields();
loadBooksFromDB(); // 刷新表格
} catch (SQLException e) {
if (e.getErrorCode() == 1062) { // Duplicate entry for ISBN
JOptionPane.showMessageDialog(this, "⚠️ ISBN \"" + isbn + "\" 已存在!", "重复 ISBN", JOptionPane.WARNING_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, "❌ 添加失败:\n" + e.getMessage(), "数据库错误", JOptionPane.ERROR_MESSAGE);
}
e.printStackTrace();
}
}
main主方法(启动类)
java
public static void main(String[] args) {
// 加载 MySQL JDBC 驱动(MySQL 8+ 可省略,但建议保留兼容性)
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "❌ 未找到 MySQL JDBC 驱动!\n请确保 mysql-connector-j.jar 在 classpath 中。",
"驱动缺失", JOptionPane.ERROR_MESSAGE);
return;
}
SwingUtilities.invokeLater(() -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ignored) {}
new LibraryWithDB().setVisible(true);
});
}
五、 源码获取
【Java开发学习/项目实战/源代码】 👇点击下方获取👇