【学生成绩管理系统】


一、选题与前期调查

1. 选题

在这里插入图片描述

2. 前期调查

主要使用gpt进行选题研究。
参考了其他人已完成的系统:

  • https://blog.csdn.net/weixin_63374437/article/details/128518646
  • https://blog.csdn.net/qq_61827376/article/details/124470583
  • https://blog.csdn.net/weixin_43887148/article/details/116887706

二、人员分工

分工姓名任务
组长黄羽悦GUIEditDelete类,GUIEditForm类,GUIOutnum类,GUISeeknum类,StudentDataGenerator 类,GUIUserLogin类,前期调查和功能设计,博客编写
组员庄雨宸JDBCUtil类,Student类,GUIInput类,编码规范设计
组员孙思雨StudentDAOJDBCImpl类,StudentDAOl类,GUImain类,前期调查和功能设计

三、项目描述

1. 项目简介

该项目是一款学生成绩管理系统,用于学校老师查询、输入、修改学生的成绩信息。

2. 项目采用技术

  • GUI图形界面
  • 数据库存储
  • 设计模式
  • git代码管理

3.功能需求分析:

  • 用户登录
  • 输入学生信息
  • 查询学生信息
    • 姓名匹配(模糊匹配)
    • 学号匹配
  • 输出统计信息
  • 编辑和删除学生

4.项目亮点:

  • 支持对学生成绩画出柱状图
  • 支持随机生成10w个学生
  • 界面交互设计细腻,操作方便。
  • 数据采用面向对象设计,扩展性强。
  • 采用DAO模式设计,结构清晰。
  • 功能完备,实现了学生成绩管理的主要功能需求。

5.系统细节

  • 系统目录:
    在这里插入图片描述

系统中包含以下主要对象:

  • GUImain:

    • 主界面类,系统主界面,负责加载和显示其他各个界面
    • 继承自Frame类,实现ActionListener接口。
    • 功能:主界面各组件及处理按钮点击事件等。
  • GUIUserLogin:

    • 用户登录界面类,进行用户名密码认证。
    • 继承自JFrame类。
    • 功能:包含用户名、密码文本框及登录按钮,处理登录事件。
  • LoginListener:

    • 登录监听器接口,定义登录成功事件回调方法。
  • GUIInput:

    • 输入学生信息界面类,负责输入学生信息。
    • 继承自Frame类,实现ActionListener接口。
    • 功能:包含文本框及按钮,处理输入及提交学生信息操作。
  • GUISeeknum:

    • 查询学生信息界面类,支持按姓名或学号查询。
    • 继承自Frame类,实现ActionListener接口。
    • 功能:包含查询条件输入框及按钮,处理姓名/学号查询操作。
  • GUIOutnum:

    • 输出学生信息界面类,显示查询结果并生成表格。
    • 继承自JFrame类,实现ActionListener接口。
    • 功能:包含总排名、科目成绩、生成报表按钮,处理各操作。
  • GUIEditDelete:

    • 编辑/删除界面类,支持修改和删除学生记录。
    • 继承自JFrame类,实现ActionListener接口。
    • 包含表格、编辑、删除按钮,处理编辑删除操作。
  • GUIEditForm:

    • 编辑界面类,具体进行编辑功能。
    • 继承自JFrame类,实现ActionListener接口。
    • 功能:包含文本框及按钮,处理编辑操作。
  • JDBCUtil:

    • 数据库连接工具类,负责数据库的连接、查询和更新等工作
  • StudentDAOJDBCImpl:

    • 实现了StudentDAO接口的类,用于实现对学生信息的数据库操作。
  • Student:

    • 学生类,包含学生的各项属性和对应的getter和setter方法。

这些类主要使用继承、接口和委托接管界面和业务逻辑的职责。不同界面类负责对应的界面展现和事件响应。JDBCUtil负责数据层操作。整体采用MVC模式进行分层设计。

各界面类主要属性包括UI组件,方法主要是初始化界面、注册监听器和处理相关事件。JDBCUtil封装了数据库连接和操作方法。

四、功能运行结果展示

  1. 用户登录,有验证操作

    在这里插入图片描述

  2. 系统主界面
    在这里插入图片描述

  3. 输入信息
    在这里插入图片描述

  4. 查询信息
    按姓名查询(支持模糊匹配)以表格方式展示

在这里插入图片描述
按学号查询
在这里插入图片描述
5.输出成绩总体排名
在这里插入图片描述
6.成绩柱状图
在这里插入图片描述
7.编辑学生信息
在这里插入图片描述
在这里插入图片描述
5. 删除学生信息
在这里插入图片描述
6. 生成10w个学生

在这里插入图片描述

五、关键代码

数据库建表

CREATE TABLE students (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
gender CHAR(1) NOT NULL,
birthdate DATE,
math FLOAT(5,2),
English FLOAT(5,2),
Java FLOAT(5,2),
computer FLOAT(5,2),
score FLOAT(5,2),
average FLOAT(5,2),
PRIMARY KEY (id)
);

代码:

  • 输入信息
    public void actionPerformed(ActionEvent e) {  // 实现 ActionListener 接口的方法
        if (e.getSource() == submitButton) {  // 当点击提交按钮时
            // 获取用户输入
            String name = nameField.getText();
            String gender = genderField.getText();
            String birthday = birthdayField.getText();
            double mathScore = Double.parseDouble(mathField.getText());
            double englishScore = Double.parseDouble(englishField.getText());
            double javaScore = Double.parseDouble(javaField.getText());
            double computerScore = Double.parseDouble(computerField.getText());
            // 计算总分和平均分
            double totalScore = mathScore + englishScore + javaScore + computerScore;
            double averageScore = totalScore / 4;
            // 保存学生信息
            try {
				saveStudentInfo(name, gender, birthday, mathScore, englishScore, javaScore, computerScore, totalScore, averageScore);  // 调用保存学生信息的方法
			} catch (Exception e1) {
				e1.printStackTrace();  // 打印异常信息
			}
        } else if (e.getSource() == exitButton) {  // 当点击退出按钮时
            setVisible(false);  // 隐藏窗口
            dispose();  // 释放窗口资源
        }
    }

    private void saveStudentInfo(String name, String gender, String birthday, double mathScore, double englishScore, double javaScore, double computerScore, double totalScore, double averageScore) throws Exception {
        try (JDBCUtil db = new JDBCUtil()) {  // 使用 try-with-resources 语句创建 JDBCUtil 实例
            Connection conn = db.getConn();  // 获取数据库连接
            String sql = "INSERT INTO students (name, gender, birthdate, math, English, Java, computer, score, average) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";  // 定义插入学生信息的 SQL 语句
            PreparedStatement pst = conn.prepareStatement(sql);  // 创建 PreparedStatement 对象
            pst.setString(1, name);  // 设置参数
            pst.setString(2, gender);
            pst.setString(3, birthday);
            pst.setDouble(4, mathScore);
            pst.setDouble(5, englishScore);
            pst.setDouble(6, javaScore);
            pst.setDouble(7, computerScore);
            pst.setDouble(8, totalScore);
            pst.setDouble(9, averageScore);
            pst.executeUpdate();  // 执行插入操作
        } catch (SQLException e) {  // 捕获异常
            e.printStackTrace();  // 打印异常信息
        }
        displayResult();  // 调用显示结果的方法
    }

    private void displayResult() {  // 显示结果的方法
        Frame resultFrame = new Frame();  // 创建结果窗口
        resultFrame.setBounds(300, 300, 350, 100);
        resultFrame.setLayout(null);
        resultFrame.setVisible(true);

        Button returnButton = new Button("返回");
        returnButton.setBounds(230, 40, 80, 30);
        returnButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                resultFrame.setVisible(false);
                resultFrame.dispose();
            }
        });

        Label resultLabel = new Label("添加成功!");  // 创建结果标签
        resultLabel.setBounds(140, 20, 100, 40);
        resultFrame.add(resultLabel);
        resultFrame.add(returnButton);

        resultFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                resultFrame.setVisible(false);
                resultFrame.dispose();
            }
        });
    }
  • 编辑或删除学生信息
public class GUIEditDelete extends JFrame implements ActionListener { // 声明 GUIEditDelete 类,继承自 JFrame 类并实现 ActionListener 接口

    private static final long serialVersionUID = 1L; // 声明一个私有静态常量 serialVersionUID

    private JButton editButton, deleteButton, backButton; // 声明三个按钮变量
    private JTable table; // 声明一个表格变量
    private JScrollPane scrollPane; // 声明一个滚动面板变量

    public GUIEditDelete() { // 声明类的构造函数
        setLayout(new BorderLayout()); // 设置布局为 BorderLayout

        // 创建按钮
        JPanel buttonPanel = new JPanel(); // 创建一个面板
        editButton = new JButton("编辑"); // 创建编辑按钮
        deleteButton = new JButton("删除"); // 创建删除按钮
        backButton = new JButton("返回"); // 创建返回按钮
        editButton.addActionListener(this); // 为编辑按钮添加事件监听器
        deleteButton.addActionListener(this); // 为删除按钮添加事件监听器
        backButton.addActionListener(this); // 为返回按钮添加事件监听器
        buttonPanel.add(editButton); // 将编辑按钮添加到面板
        buttonPanel.add(deleteButton); // 将删除按钮添加到面板
        buttonPanel.add(backButton); // 将返回按钮添加到面板

        // 创建表格
        String[] columnNames = {"学号", "姓名", "性别", "生日", "数学", "英语", "Java", "计算机", "总成绩", "平均成绩"}; // 定义表格列的标题
        DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0); // 创建一个表格模型
        table = new JTable(tableModel); // 创建表格对象
        scrollPane = new JScrollPane(table); // 创建滚动面板,并将表格添加到滚动面板中

        // 将按钮和表格加到容器中
        add(buttonPanel, BorderLayout.NORTH); // 将按钮面板添加到窗口顶部
        add(scrollPane, BorderLayout.CENTER); // 将表格添加到窗口中间

        // 查询数据库,并填充表格数据
        fillTableData(); // 调用 fillTableData 方法从数据库中获取数据并填充到表格中
    }

    public void fillTableData() { // 声明 fillTableData 方法,用于填充表格数据
        try (JDBCUtil jdbc = new JDBCUtil()) { // 使用 try-with-resources 语句创建 JDBCUtil 实例
            Connection conn = jdbc.getConn(); // 获取数据库连接
            String sql = "SELECT id, name, gender, birthdate, math, English, Java, computer, (math + English + Java + computer) AS total, (math + English + Java + computer) / 4 AS average FROM students"; // 定义 SQL 查询语句
            Statement stmt = conn.createStatement(); // 创建 Statement 对象
            ResultSet rs = stmt.executeQuery(sql); // 执行查询,返回结果集

            DefaultTableModel tableModel = (DefaultTableModel) table.getModel(); // 获取表格的模型
            tableModel.setRowCount(0); // 清空表格数据

            while (rs.next()) { // 循环遍历结果集
                Object[] row = { // 定义一行数据
                    rs.getInt("id"),
                    rs.getString("name"),
                    rs.getString("gender"),
                    rs.getString("birthdate"),
                    rs.getDouble("math"),
                    rs.getDouble("English"),
                    rs.getDouble("Java"),
                    rs.getDouble("computer"),
                    rs.getDouble("total"),
                    rs.getDouble("average")
                };
                tableModel.addRow(row); // 将一行数据添加到表格模型中
            }

            rs.close(); // 关闭结果集
            stmt.close(); // 关闭 Statement
        } catch (Exception e) { // 捕获异常
            e.printStackTrace(); // 打印异常信息
        }
    }

    public void actionPerformed(ActionEvent e) { // 实现 ActionListener 接口的方法
        if (e.getSource() == editButton) { // 当点击编辑按钮时
            int selectedRow = table.getSelectedRow(); // 获取用户选中的行
            if (selectedRow == -1) { // 如果没有选中行
                JOptionPane.showMessageDialog(null, "请选择一行数据进行编辑", "提示", JOptionPane.INFORMATION_MESSAGE); // 显示提示消息框
            } else { // 如果选中了行
                int studentId = (Integer) table.getValueAt(selectedRow, 0); // 获取学生学号
                String studentName = (String) table.getValueAt(selectedRow, 1); // 获取学生姓名
                GUIEditForm editForm = new GUIEditForm(studentId, studentName); // 创建编辑界面实例
                editForm.setVisible(true); // 显示编辑界面
                this.dispose(); // 关闭当前界面
            }
        } else if (e.getSource() == deleteButton) { // 当点击删除按钮时
            int selectedRow = table.getSelectedRow(); // 获取用户选中的行
            if (selectedRow == -1) { // 如果没有选中行
                JOptionPane.showMessageDialog(null, "请选择一行数据进行删除", "提示", JOptionPane.INFORMATION_MESSAGE); // 显示提示消息框
            } else { // 如果选中了行
                int studentId = (Integer) table.getValueAt(selectedRow, 0); // 获取学生学号
                deleteStudent(studentId); // 调用 deleteStudent 方法删除学生信息
            }
        } else if (e.getSource() == backButton) { // 当点击返回按钮时
            setVisible(false); // 隐藏当前窗口
            dispose(); // 释放当前窗口资源
        }
    }

    public void deleteStudent(int studentId) { // 声明 deleteStudent 方法,用于删除学生信息
        int result = JOptionPane.showConfirmDialog(null, "是否确认删除该学生信息?", "确认", JOptionPane.YES_NO_OPTION); // 显示确认对话框
        if (result == JOptionPane.YES_OPTION) { // 如果确认删除
            try (JDBCUtil db = new JDBCUtil()) { // 使用 try-with-resources 语句创建 JDBCUtil 实例
                Connection conn = db.getConn(); // 获取数据库连接
                String sql = "DELETE FROM students WHERE id = ?"; // 定义 SQL 删除语句
                PreparedStatement pst = conn.prepareStatement(sql); // 创建 PreparedStatement 对象
                pst.setInt(1, studentId); // 设置参数
                pst.executeUpdate(); // 执行删除操作
                fillTableData(); // 删除后刷新表格数据
            } catch (Exception e) { // 捕获异常
                e.printStackTrace(); // 打印异常信息
            }
        }
    }
  • 展示总体排名和柱状图
    public void actionPerformed(ActionEvent e) {  // 处理按钮点击的方法
        if (e.getSource() == overallRankButton) {  // 当点击总体排名按钮时
            JFrame frame = new JFrame();  // 创建新的窗口
            frame.setBounds(600, 130, 500, 750);  // 设置窗口位置和大小
            frame.setLayout(new BorderLayout());  // 使用边界布局管理器
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  // 设置关闭操作

            backButton.setBounds(380, 690, 80, 30);  // 设置按钮位置
            backButton.addActionListener(this);  // 添加事件监听器

            try (JDBCUtil db = new JDBCUtil()) {  // 使用 try-with-resources 语句创建 JDBCUtil 实例
                Connection conn = db.getConn();  // 获取数据库连接
                int rank = 1;  // 初始化排名为1
                try {
                    Statement stmt = conn.createStatement();  // 创建 Statement 对象
                    String sql = "SELECT name, id, math, English, Java, computer, (math + English + Java + computer) AS total " +
                                 "FROM students ORDER BY total DESC";  // 定义查询总体排名的 SQL 语句
                    ResultSet rs = stmt.executeQuery(sql);  // 执行查询语句

                    DefaultTableModel tableModel = new DefaultTableModel();  // 创建默认表格模型
                    tableModel.addColumn("排名");  // 添加列
                    tableModel.addColumn("姓名");
                    tableModel.addColumn("学号");
                    tableModel.addColumn("数学成绩");
                    tableModel.addColumn("英语成绩");
                    tableModel.addColumn("Java成绩");
                    tableModel.addColumn("计算机成绩");
                    tableModel.addColumn("总成绩");
                    tableModel.addColumn("平均成绩");

                    while (rs.next()) {  // 遍历结果集
                        double math = rs.getDouble("math");  // 获取数学成绩
                        double english = rs.getDouble("English");  // 获取英语成绩
                        double java = rs.getDouble("Java");  // 获取Java成绩
                        double computer = rs.getDouble("computer");  // 获取计算机成绩

                        double total = math + english + java + computer;  // 计算总成绩
                        double average = total / 4;  // 计算平均成绩
                        
                        // 将数据添加到表格模型中
                        String[] row = {String.valueOf(rank), rs.getString("name"), rs.getString("id"),
                                String.valueOf(math), String.valueOf(english),
                                String.valueOf(java), String.valueOf(computer),
                                String.valueOf(total), // 总成绩
                                String.valueOf(average)}; // 平均成绩
                        tableModel.addRow(row);  // 添加行
                        rank++;  // 排名加1
                    }

                    // 创建表格并添加到滚动面板中
                    JTable table = new JTable(tableModel);  // 创建表格
                    JScrollPane scrollPane = new JScrollPane(table);  // 创建滚动面板
                    frame.add(scrollPane, BorderLayout.CENTER);  // 添加到窗口中
                    frame.add(backButton, BorderLayout.SOUTH);  // 添加返回按钮到窗口底部

                    rs.close();  // 关闭结果集
                    stmt.close();  // 关闭 Statement
                    conn.close();  // 关闭连接
                } catch (Exception e1) {
                    e1.printStackTrace();  // 打印异常信息
                }
            } catch (Exception e1) {
                e1.printStackTrace();  // 打印异常信息
            }
            frame.setVisible(true);  // 显示窗口

        } else if (e.getSource() == subjectScoresButton) {  // 当点击科目成绩按钮时
            JFrame frame = new JFrame();  // 创建新的窗口
            frame.setBounds(300, 300, 450, 450);  // 设置窗口位置和大小
            frame.setLayout(new BorderLayout());  // 使用边界布局管理器
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  // 设置关闭操作

            DefaultCategoryDataset dataset = new DefaultCategoryDataset();  // 创建默认分类数据集
            try (JDBCUtil db = new JDBCUtil()) {  // 使用 try-with-resources 语句创建 JDBCUtil 实例
                Connection conn = db.getConn();  // 获取数据库连接
                Statement stmt = conn.createStatement();  // 创建 Statement 对象

                String query = "SELECT math, English, Java, computer FROM students";  // 定义查询学生各科目成绩的 SQL 语句
                ResultSet rs = stmt.executeQuery(query);  // 执行查询语句

                while (rs.next()) {  // 遍历结果集
                    // 将各科目成绩添加到数据集中
                    dataset.addValue(rs.getDouble("math"), "Math", "Student");
                    dataset.addValue(rs.getDouble("English"), "English", "Student");
                    dataset.addValue(rs.getDouble("Java"), "Java", "Student");
                    dataset.addValue(rs.getDouble("computer"), "Computer", "Student");
                }

                JFreeChart barChart = ChartFactory.createBarChart("Student's subject grades", "Subject", "Grades", dataset);  // 创建柱状图

                chartPanel = new ChartPanel(barChart);  // 创建图表面板
                frame.add(chartPanel, BorderLayout.CENTER);  // 添加图表面板到窗口中

                rs.close();  // 关闭结果集
                stmt.close();  // 关闭 Statement
                conn.close();  // 关闭连接
            } catch (Exception ex) {
                ex.printStackTrace();  // 打印异常信息
            }

            frame.setVisible(true);  // 显示窗口
        } else if (e.getSource() == backButton) {  // 当点击返回按钮时
        	setVisible(false);  // 隐藏窗口
            dispose();  // 释放资源
        }
    }
  • 用户登录
    public GUIUserLogin() {  // 构造方法
        setTitle("用户登录");  // 设置窗口标题
        setSize(400, 250);  // 设置窗口大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // 设置默认关闭操作

        JPanel panel = new JPanel(new GridBagLayout());  // 创建面板并使用网格包布局管理器
        GridBagConstraints gbc = new GridBagConstraints();  // 创建网格包容器

        JLabel usernameLabel = new JLabel("用户名:");  // 创建用户名标签
        usernameField = new JTextField(15);  // 创建用户名文本框并设置长度
        JLabel passwordLabel = new JLabel("密码:");  // 创建密码标签
        passwordField = new JPasswordField(15);  // 创建密码文本框并设置长度
        JButton loginButton = new JButton("登录");  // 创建登录按钮

        gbc.fill = GridBagConstraints.HORIZONTAL;  // 设置组件填充方式
        gbc.insets = new Insets(20, 20, 20, 20);  // 设置组件之间的间距

        gbc.gridx = 0;
        gbc.gridy = 0;
        panel.add(usernameLabel, gbc);  // 添加用户名标签到面板

        gbc.gridx = 1;
        gbc.gridy = 0;
        panel.add(usernameField, gbc);  // 添加用户名文本框到面板

        gbc.gridx = 0;
        gbc.gridy = 1;
        panel.add(passwordLabel, gbc);  // 添加密码标签到面板

        gbc.gridx = 1;
        gbc.gridy = 1;
        panel.add(passwordField, gbc);  // 添加密码文本框到面板

        gbc.gridwidth = 1;  // 设置按钮跨两列
        gbc.gridx = 1;
        gbc.gridy = 2;
        panel.add(loginButton, gbc);  // 添加登录按钮到面板

        add(panel);  // 将面板添加到窗口
        setLocationRelativeTo(null);  // 将窗口位置设置为屏幕中央

        loginButton.addActionListener(new ActionListener() {  // 登录按钮的点击事件监听器
            @Override
            public void actionPerformed(ActionEvent e) {
                String username = usernameField.getText();  // 获取用户名文本框的值
                String password = new String(passwordField.getPassword());  // 获取密码文本框的值

                // 实现验证逻辑,这里使用假的用户名和密码做示例
                if (username.equals("咕噜咕噜") && password.equals("123")) {  // 如果用户名和密码匹配
                    // 登录成功
                    JOptionPane.showMessageDialog(GUIUserLogin.this, "登录成功");  // 显示登录成功的消息
                    if (loginListener != null) {
                        loginListener.onLoginSuccess();  // 调用登录监听器的登录成功方法
                    }
                    dispose();  // 销毁窗口
                }
                else {
                    // 登录失败
                    JOptionPane.showMessageDialog(GUIUserLogin.this, "账号或密码错误,请重新输入");  // 显示登录失败的消息
                    // 清空文本框
                    usernameField.setText("");  // 清空用户名文本框
                    passwordField.setText("");  // 清空密码文本框
                }
            }
        });
    }
  • 查询信息
	public void actionPerformed(ActionEvent e) {  // 处理按钮点击的方法
		String input = c1.getText().trim();  // 获取输入的文本并去除两端空白
		if (e.getSource() == b1) {  // 当点击“根据姓名查询”按钮时
			if (input.isEmpty()) {  // 如果输入为空
				JOptionPane.showMessageDialog(this, "请输入姓名", "提醒", JOptionPane.INFORMATION_MESSAGE);  // 显示消息对话框
			} else {
				try {
					searchByName(input);  // 调用根据姓名查询的方法
				} catch (Exception e1) {  // 处理异常
					e1.printStackTrace();  // 打印异常信息
				}
			}
		} else if (e.getSource() == b2) {  // 当点击“根据学号查询”按钮时
			if (input.isEmpty()) {  // 如果输入为空
				JOptionPane.showMessageDialog(this, "请输入学号", "提醒", JOptionPane.INFORMATION_MESSAGE);  // 显示消息对话框
			} else {
				try {
					searchById(input);  // 调用根据学号查询的方法
				} catch (Exception e1) {  // 处理异常
					e1.printStackTrace();  // 打印异常信息
				}
			}
		} else if (e.getSource() == b3) {  // 当点击“退出”按钮时
			setVisible(false);  // 隐藏窗口
            dispose();  // 释放资源
		}
	}

	private void searchByName(String name) throws Exception {  // 根据姓名查询的方法
	    String sql = "select * from students where name like ?";  // 使用占位符的 SQL 语句
	    try (JDBCUtil db = new JDBCUtil(); 
	         Connection conn = db.getConn();
	         PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
	        preparedStatement.setString(1, "%" + name + "%");  // 设置占位符的值
	        try (ResultSet rs = preparedStatement.executeQuery()) {  // 执行查询并获取结果集
	            int count = 0;  // 计数器
	            while (rs.next()) {  // 遍历结果集
	                showStudentInfo(rs);  // 显示学生信息
	                count++;
	            }
	            if (count == 0) {  // 如果没有找到学生信息
	                JOptionPane.showMessageDialog(this, "没有找到学生信息", "提醒", JOptionPane.INFORMATION_MESSAGE);  // 显示消息对话框
	            }
	        }
	    } catch (SQLException ex) {  // 处理异常
	        ex.printStackTrace();  // 打印异常信息
	    }
	}

	private void searchById(String id) throws Exception {  // 根据学号查询的方法
		try {
	        int studentId = Integer.parseInt(id);  // 将学号转换为整数
	        String sql = "select * from students where id=" + studentId;  // 构造查询的 SQL 语句
	        executeQuery(sql);  // 执行查询
	    } catch (NumberFormatException e) {  // 处理格式转换异常
	        JOptionPane.showMessageDialog(this, "学号必须是数字", "错误", JOptionPane.ERROR_MESSAGE);  // 显示错误消息对话框
	    }
	}

	private void executeQuery(String sql) throws Exception {  // 执行查询的方法
	    try (JDBCUtil db = new JDBCUtil(); 
	            Connection conn = db.getConn();
	            Statement stmt = conn.createStatement();
	            ResultSet rs = stmt.executeQuery(sql)) {
	           int count = 0;  // 计数器
	           while (rs.next()) {  // 遍历结果集
	               showStudentInfo(rs);  // 显示学生信息
	               count++;
	           }
	           if (count == 0) {  // 如果没有找到学生信息
	               JOptionPane.showMessageDialog(this, "没有找到学生信息", "提醒", JOptionPane.INFORMATION_MESSAGE);  // 显示消息对话框
	           }
	       } catch (SQLException ex) {  // 处理异常
	           ex.printStackTrace();  // 打印异常信息
	       }
	}

	private void showStudentInfo(ResultSet rs) throws SQLException {  // 显示学生信息的方法
		String studentInfo = "学号: " + rs.getString("id") + "\n姓名: " + rs.getString("name") + "\n性别: "
				+ rs.getString("gender") + "\n生日: " + rs.getDate("birthdate") + "\n应用数学: " + rs.getFloat("math")
				+ "\n大学英语: " + rs.getFloat("English") + "\nJava程序设计: " + rs.getFloat("Java") + "\n计算机应用基础: "
				+ rs.getFloat("computer") + "\n总分: " + rs.getFloat("score") + "\n平均分: " + rs.getFloat("average");  // 构建学生信息字符串
		JOptionPane.showMessageDialog(this, studentInfo, "学生信息", JOptionPane.INFORMATION_MESSAGE);  // 显示消息对话框
	}

六、使用git管理代码

仓库地址:https://gitee.com/wuxigoulu/java7
在这里插入图片描述


遇到的困难

  • GUI界面中文显示不出来
    解决方法:在要运行的代码上右键 Run As --> Run Configurations。在 Arguments --> VM arguments: 中增加: -Dfile.encoding=gbk
    在这里插入图片描述
  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值