【Java基础开发】基于 Java Swing +MySQL + JDBC 版实现图书管理系统

博主介绍:✌全网粉丝阅读量30W+,CSDN特邀作者、博客专家、CSDN新星计划导师,博客之星、平台优质作者、专注于Java技术领域和项目实战✌

🍅文末获取源码联系🍅

一、前言介绍

随着信息技术的飞速发展,传统的手工图书管理方式已难以满足现代图书馆高效、精准的管理需求。图书管理系统作为信息管理系统(MIS)的典型应用,旨在通过计算机技术实现图书信息的数字化存储、智能化检索与规范化管理,从而大幅提升工作效率,降低人工操作失误率。

本项目基于 Java Swing 图形用户界面框架与 MySQL 关系型数据库,设计并实现了一套功能完善的桌面端图书管理系统。系统支持图书信息的增删查改、多条件组合检索以及数据的持久化存储,界面简洁直观,操作便捷高效。通过本项目的开发,不仅加深了对 Java GUI 编程和 JDBC 数据库访问技术的理解,也实践了软件工程中模块化设计、异常处理与人机交互设计的基本思想,为后续从事企业级应用开发奠定了坚实基础。

二、主要技术

技术领域 具体技术 说明
开发语言 Java SE 采用 Java 标准版进行开发,具备良好的跨平台特性
GUI 框架 Java Swing 使用 JFrameJTableJPanel 等组件构建桌面图形界面,采用 BorderLayoutGridLayoutFlowLayout 混合布局管理
数据库 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开发学习/项目实战/源代码】 👇点击下方获取👇

相关推荐
踩着两条虫1 天前
「AI + 低代码」的可视化设计器
开发语言·前端·低代码·设计模式·架构
JoneBB1 天前
ABAP Webservice连接
运维·开发语言·数据库·学习
budingxiaomoli1 天前
Spring IoC &DI
java·spring·ioc·di
Spider Cat 蜘蛛猫1 天前
Springboot SSO系统设计文档
java·spring boot·后端
未若君雅裁1 天前
MySQL高可用与扩展-主从复制读写分离分库分表
java·数据库·mysql
即使再小的船也能远航1 天前
【Python】安装
开发语言·python
学习中.........1 天前
从扰动函数的变化,感受红黑树带来的性能提升
java
Irissgwe1 天前
类与对象(三)
开发语言·c++·类和对象·友元
计算机安禾1 天前
【c++面向对象编程】第24篇:类型转换运算符:自定义隐式转换与explicit
java·c++·算法
雪度娃娃1 天前
转向现代C++——优先选用nullptr而不是0和NULL
开发语言·c++