本專案示範使用 Java Swing 建立桌面應用程式,搭配 MySQL 資料庫與 JDBC 實作學生資料的增刪改查(CRUD)。程式碼採用簡易分層:Test3(主視窗/控制器)、StuModel(資料模型/DAO)、StuAddDiag/StuUpDiag(對話框/View)。
CREATE DATABASE spdb1 CHARACTER SET utf8mb4;
USE spdb1;
CREATE TABLE stu (
stuId VARCHAR(20) PRIMARY KEY,
stuName VARCHAR(50),
stuSex VARCHAR(10),
stuAge INT,
stuJG VARCHAR(50), -- 籍貫
stuDept VARCHAR(50) -- 門派/系所
);
| 類別 | 職責 | 關鍵技術點 |
|---|---|---|
| Test3 | 主視窗、事件分派、元件組裝 | JFrame、JTable、JScrollPane、ActionListener、JOptionPane |
| StuModel | 繼承 AbstractTableModel,封裝 JDBC 查詢/刪除,提供表格資料 | Vector 雙層儲存行/列、DriverManager、PreparedStatement、try-with-resources 風格關閉資源 |
| StuAddDiag | 新增學生對話框(Modal JDialog) | GridLayout、PreparedStatement 參數化插入、dispose() 關閉 |
| StuUpDiag | 修改學生對話框,預填選中行資料 | 建構子接收 StuModel 與 rowNum、參數化 UPDATE(原碼誤用 INSERT,見下) |
public void init(String sql) {
if (sql == null || sql.isEmpty()) sql = "SELECT * FROM stu";
// 設定欄名
columnNames = new Vector<>(Arrays.asList("學號","名字","性別","年齡","籍貫","門派"));
rowData = new Vector<>();
try (Connection ct = DriverManager.getConnection(URL, USER, PWD);
Statement stat = ct.createStatement();
ResultSet rs = stat.executeQuery(sql)) {
while (rs.next()) {
Vector
改進點:使用 try-with-resources 自動關閉資源、參數化 URL/帳密為常數、空 SQL 防護。
String stuId = (String) sm.getValueAt(rowNum, 0);
try (Connection ct = DriverManager.getConnection(URL, USER, PWD);
PreparedStatement ps = ct.prepareStatement("DELETE FROM stu WHERE stuId = ?")) {
ps.setString(1, stuId);
ps.executeUpdate();
JOptionPane.showMessageDialog(this, "刪除成功");
} catch (SQLException e) { e.printStackTrace(); }
sm = new StuModel(); jt.setModel(sm); // 刷新表格
String sql = "INSERT INTO stu VALUES (?,?,?,?,?,?)";
try (Connection ct = DriverManager.getConnection(URL, USER, PWD);
PreparedStatement ps = ct.prepareStatement(sql)) {
ps.setString(1, jf1.getText()); // stuId
ps.setString(2, jf2.getText()); // stuName
ps.setString(3, jf3.getText()); // stuSex
ps.setString(4, jf4.getText()); // stuAge
ps.setString(5, jf5.getText()); // stuJG
ps.setString(6, jf6.getText()); // stuDept
ps.executeUpdate();
dispose();
}
原碼錯誤:String strsql = "insert into stu values(?,?,?,?,?,?)"; 會導致主鍵衝突或重複資料。
// 正確 UPDATE 寫法
String sql = "UPDATE stu SET stuName=?, stuSex=?, stuAge=?, stuJG=?, stuDept=? WHERE stuId=?";
try (Connection ct = DriverManager.getConnection(URL, USER, PWD);
PreparedStatement ps = ct.prepareStatement(sql)) {
ps.setString(1, jf2.getText());
ps.setString(2, jf3.getText());
ps.setString(3, jf4.getText());
ps.setString(4, jf5.getText());
ps.setString(5, jf6.getText());
ps.setString(6, jf1.getText()); // WHERE 條件
ps.executeUpdate();
dispose();
}
StudentDAO 介面 + 實作,Model 僅負責表格資料結構。DriverManager,提升併發效能。printStackTrace()。LIMIT offset, size)與表頭點擊排序。mysql-connector-java-8.x.jar)加入 Classpath