【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开发学习/项目实战/源代码】 👇点击下方获取👇

相关推荐
古法安卓3 小时前
Android-日志系统源码解析
android·java·android studio
小夏coding4 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进
java·后端
这个DBA有点耶5 小时前
从MySQL 5.7到8.0:JSON查询性能差在哪?虚拟列索引vs多值索引怎么选
数据库·mysql·架构
MacroZheng5 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
十年Java程序媛6 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
xiaoqiMikko6 小时前
有人在搜一个不存在的 Tomcat 版本
java·tomcat
用户31268748772010 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang10 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing10 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
吃饱了得干活11 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端