学生信息管理系统

一、项目背景与目标

        本项目是一次 Java 课程设计实践,旨在通过图形化界面和数据库操作的结合,掌握 Java Swing 编程、JDBC 数据访问技术,以及基础的 CRUD 应用开发流程。系统实现学生数据的添加、编辑、删除、查询等功能,界面简洁,操作直观,并与 MySQL 数据库进行交互。


二、系统功能概述

本系统主要功能包括:

  • 学生信息展示:以表格形式展示所有学生数据。

  • 关键词查询:支持按学号或姓名模糊查询。

  • 新增学生:通过弹窗表单添加新学生。

  • 编辑学生:选中一行后,可编辑其详细信息。

  • 删除学生:可删除选中行的学生记录。

  • 数据自动刷新:每次操作完成后,表格自动更新。

数据库使用 MySQL,前端使用 Java Swing 编写图形界面,后台通过 JDBC 完成数据操作。


三、核心技术栈

模块技术
图形界面Java Swing 
数据交互JDBC 
数据库MySQL,使用 students
架构模式简易 MVC,界面和数据分离
IDEIntelliJ 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());
        }
    }
}

六、运行效果展示

  • 界面启动:显示主窗口和学生列表;

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

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

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

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


七、源代码

       Gitee : https://gitee.com/zlinguo/javaDesign

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值