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

相关推荐
TE-茶叶蛋2 小时前
Spring最核心扩展点:BeanPostProcessor
java·后端·spring
Mr.45672 小时前
SpringBoot多模块依赖冲突排查与架构优化实战(避坑指南)
java·spring boot·架构
学术阿凡提2 小时前
Spring Boot 优雅实现异步调用:从入门到自定义线程池与异常处理
java·数据库·算法
Gary Studio2 小时前
安卓HAL编译流程
开发语言·python
我是无敌小恐龙2 小时前
Java SE 零基础入门Day06 方法重载+Debug调试+String字符串全套API详解(超全干货)
java·开发语言·人工智能·python·transformer·无人机·量子计算
AI+程序员在路上2 小时前
Qt6读取rtsp视频流的几种方法
开发语言·qt6.3
xiaoye37082 小时前
java接口文档工具 swagger2和swagger3对比
java·服务器·前端
三维频道2 小时前
工业级三维扫描实测:汽车灯具复杂结构件的全尺寸 3D 测量方案分析
java·人工智能·python·数码相机·3d·汽车·汽车轻量化制造
tongyiixiaohuang2 小时前
基于轻易云的数据集成,实现企业系统间灵活对接
java·前端·数据库