本文展示一個基於 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) -- 價格
);
BookTableModel 繼承 AbstractTableModel,封裝 JDBC 查詢與表格數據綁定BookInfo 主視窗(JTable + 工具欄)、AddBookDialog、ModifyBook 模態對話框actionPerformed 統一分發事件,調用 Model 更新數據並刷新視圖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) { /* 執行更新並捕獲異常 */ }
}
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 */ }
}
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();
}
}
PreparedStatement 防注入這個圖書管理系統雖功能基礎,但完整展示了 Java 桌面開發的核心模式:Swing 組件佈局、事件分發、TableModel 數據綁定、JDBC 參數化操作、模態對話框交互。代碼結構清晰分層,便於理解與擴展,是進階開發企業級桌面應用的優秀起點。