一、项目背景与目标
本项目是一次 Java 课程设计实践,旨在通过图形化界面和数据库操作的结合,掌握 Java Swing 编程、JDBC 数据访问技术,以及基础的 CRUD 应用开发流程。系统实现学生数据的添加、编辑、删除、查询等功能,界面简洁,操作直观,并与 MySQL 数据库进行交互。
二、系统功能概述
本系统主要功能包括:
-
学生信息展示:以表格形式展示所有学生数据。
-
关键词查询:支持按学号或姓名模糊查询。
-
新增学生:通过弹窗表单添加新学生。
-
编辑学生:选中一行后,可编辑其详细信息。
-
删除学生:可删除选中行的学生记录。
-
数据自动刷新:每次操作完成后,表格自动更新。
数据库使用 MySQL,前端使用 Java Swing 编写图形界面,后台通过 JDBC 完成数据操作。
三、核心技术栈
| 模块 | 技术 |
|---|---|
| 图形界面 | Java Swing |
| 数据交互 | JDBC |
| 数据库 | MySQL,使用 students 表 |
| 架构模式 | 简易 MVC,界面和数据分离 |
| IDE | IntelliJ IDEA |
四、数据库设计
数据库名:library_db
表名:students
CREATE TABLE students (
id VARCHAR(20) PRIMARY KEY,
name VARCHAR(50),
gender VARCHAR(10),
birthdate DATE,
politics VARCHAR(20),
address VARCHAR(100),
phone VARCHAR(20),
dorm VARCHAR(20)
);
五、关键实现代码
1. 加载 MySQL 驱动
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "未找到 MySQL 驱动: " + e.getMessage());
System.exit(1);
}
}
2. 查询功能实现
private void editData(String str) {
model.setRowCount(0);
String sql = "SELECT id,name,gender,birthdate,politics,address,phone,dorm FROM students";
if (str != null && !str.isEmpty()) {
sql += " WHERE id LIKE ? OR name LIKE ?";
}
try (
Connection c = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = c.prepareStatement(sql)
) {
if (str != null && !str.isEmpty()) {
String key = "%" + str + "%";
ps.setString(1, key);
ps.setString(2, key);
}
try (ResultSet rs = ps.executeQuery()) { // 遍历
while (rs.next()) {
model.addRow(new Object[]{
rs.getString("id"),
rs.getString("name"),
rs.getString("gender"),
rs.getDate("birthdate"),
rs.getString("politics"),
rs.getString("address"),
rs.getString("phone"),
rs.getString("dorm")
});
}
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "加载数据失败: " + e.getMessage());
}
}
3. 新增与编辑的通用表单弹窗
private void showDialog(Object[] data) {
JTextField[] f = new JTextField[8]; // 文本框数组
String[] labels = {
"学号","姓名","性别","出生日期(YYYY-MM-DD) ",
"政治面貌","家庭住址","电话","宿舍号"
};
JPanel p = new JPanel(new GridLayout(8, 2)); // 8 行 2 列
for (int i = 0; i < 8; i++) {
p.add(new JLabel(labels[i]));
f[i] = new JTextField(data != null ? data[i].toString() : "");
p.add(f[i]);
}
int ok = JOptionPane.showConfirmDialog(
null, p, data == null ? "新增" : "编辑",
JOptionPane.OK_CANCEL_OPTION
);
if (ok == JOptionPane.OK_OPTION) {
saveOrUpdate(f, data);
editData(searchField.getText().trim());
}
}
4. 数据更新
private void saveOrUpdate(JTextField[] f, Object[] old) {
String sql;
if (old == null) {
sql = "INSERT INTO students(id,name,gender,birthdate,politics,address,phone,dorm) " +
"VALUES(?,?,?,?,?,?,?,?)";
} else {
sql = "UPDATE students SET name=?,gender=?,birthdate=?,politics=?," +
"address=?,phone=?,dorm=? WHERE id=?";
}
try (
Connection c = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = c.prepareStatement(sql)
) {
if (old == null) {
for (int i = 0; i < 8; i++) {
ps.setString(i + 1, f[i].getText());
}
} else {
for (int i = 1; i < 8; i++) {
ps.setString(i, f[i].getText());
}
ps.setString(8, f[0].getText());
}
ps.executeUpdate();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "保存失败: " + e.getMessage());
}
}
5. 删除数据
private void deleteSelected() {
int i = table.getSelectedRow();
if (i < 0) return; // 未选中时直接返回
String id = model.getValueAt(i, 0).toString(); // 获取学号
try (
Connection c = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = c.prepareStatement(
"DELETE FROM students WHERE id=?"
)
) {
ps.setString(1, id); // 绑定主键参数
ps.executeUpdate(); // 执行删除
editData(searchField.getText().trim()); // 刷新表格
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "删除失败: " + e.getMessage());
}
}
}
六、运行效果展示
-
界面启动:显示主窗口和学生列表;

-
查询演示:输入关键字后按“查询”按钮;

-
新增演示:点击“新增”,填写表单保存;

-
编辑演示:选中一行点击“编辑”;

-
删除演示:选中一行点击“删除”。

512

被折叠的 条评论
为什么被折叠?



