首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Swing 圖書管理系統完整實現:CRUD 操作與分層架構

     編輯:Java 相關知識

本文展示一個基於 Java Swing + JDBC + MySQL 的圖書管理系統完整源碼,涵蓋查詢、新增、修改、刪除四大核心功能,採用分層架構(視圖層、模型層、數據訪問層),代碼結構清晰,適合作為 Java 桌面應用開發的教學範例與項目起點。

一、系統設計

數據庫表結構

CREATE TABLE book_info (
    book_num   VARCHAR(20) PRIMARY KEY,  -- 書號
    book_name  VARCHAR(100),             -- 書名
    book_writer VARCHAR(50),             -- 作者
    publish_house VARCHAR(100),          -- 出版社
    publish_time DATE,                   -- 出版日期
    book_price DECIMAL(10,2)             -- 價格
);

分層架構

  • Model:BookTableModel 繼承 AbstractTableModel,封裝 JDBC 查詢與表格數據綁定
  • View:BookInfo 主視窗(JTable + 工具欄)、AddBookDialog、ModifyBook 模態對話框
  • Controller:主視窗 actionPerformed 統一分發事件,調用 Model 更新數據並刷新視圖

二、核心代碼模組

1. 表格模型 —— 數據與視圖解耦

public class BookTableModel extends AbstractTableModel {
    private Vector<Vector<String>> rowData = new Vector<>();
    private Vector<String> colName = new Vector<>(Arrays.asList("書號","書名","作者","出版社","出版時間","價格"));
    private PreparedStatement stmt;
    private ResultSet rs;
    
    public BookTableModel(String sql) throws SQLException { initData(sql); }
    public BookTableModel() throws SQLException { this("SELECT * FROM book_info"); }
    
    private void initData(String sql) throws SQLException {
        // 載入驅動、獲取連接、執行查詢、填充 rowData
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/device", "root", "zjq1314520");
        stmt = conn.prepareStatement(sql);
        rs = stmt.executeQuery();
        while (rs.next()) {
            Vector<String> row = new Vector<>();
            for (int i = 1; i <= 6; i++) row.add(rs.getString(i));
            rowData.add(row);
        }
        rs.close();
    }
    
    // 實現 AbstractTableModel 三個抽象方法
    @Override public int getRowCount() { return rowData.size(); }
    @Override public int getColumnCount() { return colName.size(); }
    @Override public Object getValueAt(int r, int c) { return rowData.get(r).get(c); }
    @Override public String getColumnName(int c) { return colName.get(c); }
    
    public void addBook(String sql) { executeUpdate(sql); }
    public void deleteBook(String sql) { executeUpdate(sql); }
    private void executeUpdate(String sql) { /* 執行更新並捕獲異常 */ }
}

2. 主視窗 —— 統一事件分發

public class BookInfo extends JFrame implements ActionListener {
    private JTable bookTable;
    private BookTableModel bookTableModel;
    private JTextField searchField;
    
    public BookInfo() throws SQLException {
        initComponents();
        layoutComponents();
        registerListeners();
        refreshTable();
    }
    
    private void initComponents() {
        searchField = new JTextField(15);
        JButton btnSearch = new JButton("查詢");
        JButton btnAdd = new JButton("添加");
        JButton btnModify = new JButton("修改");
        JButton btnDelete = new JButton("刪除");
        JButton btnRefresh = new JButton("刷新");
        
        bookTableModel = new BookTableModel();
        bookTable = new JTable(bookTableModel);
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();
        if (src == btnSearch) { doSearch(); }
        else if (src == btnAdd) { new AddBookDialog(this, "添加圖書", true); refreshTable(); }
        else if (src == btnModify) { doModify(); }
        else if (src == btnDelete) { doDelete(); }
        else if (src == btnRefresh) { refreshTable(); }
    }
    
    private void doSearch() { /* 根據書名查詢並更新 TableModel */ }
    private void doModify() { /* 獲取選中行 → 彈出 ModifyBook 對話框 → 刷新 */ }
    private void doDelete() { /* 確認對話框 → 執行刪除 SQL → 刷新 */ }
    private void refreshTable() { /* 重新查詢所有數據並設置 Model */ }
}

3. 新增/修改對話框 —— 模態交互

public class AddBookDialog extends JDialog implements ActionListener {
    private JTextField[] fields = new JTextField[6]; // 書號、書名、作者、出版社、價格、出版時間
    private JButton btnOk, btnCancel;
    
    public AddBookDialog(Frame owner, String title, boolean modal) {
        super(owner, title, modal);
        initFields();
        layoutFields();
        registerListeners();
        setVisible(true);
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnOk) {
            if (Arrays.stream(fields).anyMatch(f -> f.getText().isEmpty())) {
                JOptionPane.showMessageDialog(this, "所有欄位必填");
                return;
            }
            String sql = buildInsertSQL();
            try { new BookTableModel().addBook(sql); }
            catch (SQLException ex) { ex.printStackTrace(); }
            JOptionPane.showMessageDialog(this, "添加成功");
            dispose();
        } else if (e.getSource() == btnCancel) dispose();
    }
}

三、運行截圖說明

  • 主界面:頂部搜索欄,中部 JTable 顯示圖書列表,底部操作按鈕
  • 查詢結果:輸入書名點擊查詢,表格過濾顯示匹配記錄
  • 添加圖書:模態對話框,六個輸入框,驗證非空後插入數據庫
  • 修改信息:選中表格行 → 彈出對話框自動回填 → 書號不可編輯 → 確認更新
  • 刪除操作:選中行 → 確認對話框 → 執行 DELETE SQL → 刷新列表
  • 數據庫視圖:MySQL Workbench 中 book_info 表數據與界面同步

四、優化建議與擴展方向

  1. 連接池:替換 DriverManager 為 HikariCP/Druid
  2. 預編譯參數化:所有 SQL 使用 PreparedStatement 防注入
  3. 異常處理:統一異常處理機制,用戶友好提示
  4. 分頁查詢:大數據量時實現分頁加載
  5. 圖片管理:封面圖片存儲與顯示
  6. 借閱模組:擴展借書證、借閱記錄、超期罰款功能
  7. 遷移至 JavaFX:現代化 UI、FXML 分離、綁定屬性

五、總結

這個圖書管理系統雖功能基礎,但完整展示了 Java 桌面開發的核心模式:Swing 組件佈局、事件分發、TableModel 數據綁定、JDBC 參數化操作、模態對話框交互。代碼結構清晰分層,便於理解與擴展,是進階開發企業級桌面應用的優秀起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved