Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

07-17 1007阅读

前情提要:

Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

好久没发博客了...上次的蓝桥杯国赛也没白去,混了个国三,明年Python组再见喽...

好的言归正传开始写一下做完demo的课程设计报告(弱弱整的不太行,望理解)

学生信息成绩管理系统:

功能描述:

    使用Java Swing库创建的一个简单学生成绩管理系统的图形用户界面(GUI)。它包含登录界面和主界面,主界面又分为学生信息管理和成绩管理两个标签页。StudentManagementPanel用于管理学生的个人信息,允许用户添加、更新、删除和查看学生信息。ScoreManagementPanel用于管理学生的成绩信息,允许用户添加、根据学号查找和根据姓名查找学生的成绩。

功能框架图:

Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

MYSQL建表:

Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

源码部分:

Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

StudentGradeManagementGUI.java

使用Java Swing库创建的一个简单学生成绩管理系统的图形用户界面(GUI)。它包含登录界面和主界面,主界面又分为学生信息管理和成绩管理两个标签页。定义了主面板,它创建一个包含两个标签页的面板。每个标签页都将包含不同的管理功能,这两个面板的具体实现没有在代码中给出。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
// 主类,程序入口
public class StudentGradeManagementGUI {
    public static void main(String[] args) {
        // 使用SwingUtilities.invokeLater保证GUI创建在事件分发线程中
        SwingUtilities.invokeLater(() -> {
            LoginFrame loginFrame = new LoginFrame(); // 创建登录窗口
            loginFrame.setVisible(true); // 显示登录窗口
        });
    }
}
// 登录窗口类
class LoginFrame extends JFrame {
    public LoginFrame() {
        setTitle("登录"); // 设置窗口标题
        setSize(300, 200); // 设置窗口大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置默认关闭操作
        setLocationRelativeTo(null); // 将窗口居中显示
        LoginPanel loginPanel = new LoginPanel(this); // 创建登录面板
        setContentPane(loginPanel); // 将登录面板设置为内容面板
    }
    // 登录成功后调用的方法
    public void loginSuccess() {
        dispose(); // 关闭登录窗口
        MainFrame mainFrame = new MainFrame(); // 创建主窗口
        mainFrame.setVisible(true); // 显示主窗口
    }
}
// 登录面板类
class LoginPanel extends JPanel {
    private JTextField usernameField; // 用户名输入框
    private JPasswordField passwordField; // 密码输入框
    private JButton loginButton; // 登录按钮
    private JFrame parentFrame; // 父窗口引用
    public LoginPanel(JFrame parentFrame) {
        this.parentFrame = parentFrame;
        initializeUI(); // 初始化界面
    }
    // 初始化登录面板的界面
    private void initializeUI() {
        setLayout(new GridBagLayout()); // 设置布局管理器
        setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 设置边框
        usernameField = new JTextField(15); // 创建用户名输入框
        passwordField = new JPasswordField(15); // 创建密码输入框
        loginButton = new JButton("登录"); // 创建登录按钮
        // 为登录按钮添加事件监听器
        loginButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String username = usernameField.getText(); // 获取用户名
                String password = new String(passwordField.getPassword()); // 获取密码
                if (username.isEmpty() || password.isEmpty()) {
                    // 如果用户名或密码为空,则弹出错误消息
                    JOptionPane.showMessageDialog(LoginPanel.this, "用户名和密码不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                try {
                    // 尝试进行身份验证
                    if (LoginManager.authenticate(username, password)) {
                        if (parentFrame instanceof LoginFrame) {
                            ((LoginFrame) parentFrame).loginSuccess(); // 登录成功,关闭登录窗口并打开主窗口
                        }
                    } else {
                        // 登录失败,弹出错误消息
                        JOptionPane.showMessageDialog(LoginPanel.this, "登录失败,请检查用户名和密码!", "错误", JOptionPane.ERROR_MESSAGE);
                    }
                } catch (SQLException ex) {
                    // 数据库访问错误,弹出错误消息
                    JOptionPane.showMessageDialog(LoginPanel.this, "数据库访问错误:" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        // 使用GridBagConstraints设置布局约束,添加组件到面板
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.anchor = GridBagConstraints.WEST;
        gbc.gridx = 0;
        gbc.gridy = 0;
        add(new JLabel("用户名:"), gbc);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        add(usernameField, gbc);
        gbc.gridx = 0;
        gbc.gridy = 1;
        add(new JLabel("密码:"), gbc);
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        add(passwordField, gbc);
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.gridwidth = 2;
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.fill = GridBagConstraints.NONE;
        add(loginButton, gbc);
    }
}
// 主面板类
class MainPanel extends JPanel {
    private JTabbedPane tabbedPane; // 标签页组件
    public MainPanel() {
        setLayout(new BorderLayout()); // 设置边界布局管理器
        tabbedPane = new JTabbedPane(); // 创建标签页组件
        tabbedPane.addTab("学生个人信息管理", new StudentManagementPanel()); // 添加学生信息管理标签页
        tabbedPane.addTab("学生考试成绩管理", new ScoreManagementPanel()); // 添加成绩管理标签页
        add(tabbedPane); // 将标签页组件添加到主面板
    }
}

DatabaseManager

定义了一个名为DatabaseManager的类,它负责管理与数据库的连接。这里使用的是MySQL数据库,并提供了连接数据库所需的信息和驱动加载。

  • URL:这是一个字符串,包含了连接到MySQL数据库所需的所有信息,包括数据库服务器地址、端口号、数据库名称以及字符集和时区设置等。
  • USER和PASSWORD:这两个字符串分别存储了数据库的登录用户名和密码。
  • static块:这个块在类加载时执行,用于加载MySQL的JDBC驱动。这是通过Class.forName()方法实现的,如果驱动类不存在,则会捕获ClassNotFoundException。
  • getConnection()方法:这个方法是一个静态方法,它使用DriverManager.getConnection()方法来建立与数据库的连接,并返回一个Connection对象。如果连接过程中出现任何问题,它会抛出一个SQLException。
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    public class DatabaseManager {
        private static final String URL = "jdbc:mysql://localhost:3306/StudentScores?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true";
        private static final String USER = "root";
        private static final String PASSWORD = "root";
        static {
            try {
                // 强制加载MySQL JDBC驱动
                Class.forName("com.mysql.cj.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        public static Connection getConnection() throws SQLException {
            return DriverManager.getConnection(URL, USER, PASSWORD);
        }
    }
    

    LoginManager

    定义了一个名为LoginManager的类,它包含一个静态方法authenticate,用于验证用户的登录信息。

    • authenticate方法:这个方法接受用户名和密码作为参数,并返回一个布尔值,表示登录是否成功。
    • Connection conn = DatabaseManager.getConnection():这行代码通过DatabaseManager类获取数据库连接。
    • String sql = "SELECT password FROM Users WHERE username = ?":这行代码定义了一个SQL查询,用于从Users表中选择与给定用户名对应的密码。
    • PreparedStatement stmt = conn.prepareStatement(sql):这行代码创建了一个PreparedStatement对象,用于执行SQL查询。
    • stmt.setString(1, username):这行代码设置了PreparedStatement中的参数,即用户名。
    • ResultSet rs = stmt.executeQuery():这行代码执行了SQL查询,并获取了结果集。
    • if (rs.next()):这个条件判断语句检查结果集中是否有数据。
    • String storedPassword = rs.getString("password"):这行代码从结果集中获取存储的密码。
    • return storedPassword.equals(password):这行代码比较存储的密码和用户输入的密码,如果匹配则返回true,否则返回false。
      import java.sql.*;
      public class LoginManager {
          public static boolean authenticate(String username, String password) throws SQLException {
              try (Connection conn = DatabaseManager.getConnection()) {
                  String sql = "SELECT password FROM Users WHERE username = ?";
                  PreparedStatement stmt = conn.prepareStatement(sql);
                  stmt.setString(1, username);
                  ResultSet rs = stmt.executeQuery();
                  if (rs.next()) {
                      String storedPassword = rs.getString("password");
                      return storedPassword.equals(password);
                  }
                  return false;
              }
          }
      }
      

      StudentManagementPanel

      定义了一个名为StudentManagementPanel的类,它用于管理学生的个人信息。这个类提供了一个图形界面,允许用户添加、更新、删除和查看学生信息。

      • 构造函数:初始化面板和组件,包括文本字段、按钮和标签。
      • addStudent方法:添加新学生的方法,包括检查输入字段是否为空,以及与数据库的交互。
      • updateStudent方法:更新学生信息的方法,包括检查输入字段是否为空,以及与数据库的交互。
      • deleteStudent方法:删除学生的方法,包括检查输入字段是否为空,以及与数据库的交互。
      • viewStudent方法:查看所有学生个人信息的方法,包括与数据库的交互。
        import javax.swing.*;
        import javax.swing.table.DefaultTableModel;
        import java.awt.*;
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
        import java.sql.*;
        import java.time.LocalDate;
        import java.time.format.DateTimeFormatter;
        // 学生管理面板类
        public class StudentManagementPanel extends JPanel {
            private JTextField studentIdField, nameField, genderField, birthDateField;// 定义文本字段,用于输入学生信息
            private JButton addButton, updateButton, deleteButton, viewButton;// 定义按钮,用于执行添加、更新、删除和查看学生信息的操作
            private JLabel statusLabel;// 定义状态标签,用于显示操作结果或错误信息
            public StudentManagementPanel() {// 构造函数,用于初始化面板和添加组件
                setLayout(new GridBagLayout()); // 设置布局管理器为网格袋布局
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.insets = new Insets(5, 5, 5, 5); // 设置组件间的间距
                gbc.anchor = GridBagConstraints.WEST; // 设置组件对齐方式为左对齐
                // 添加学生ID标签和文本字段
                gbc.gridx = 0; // 组件的x坐标
                gbc.gridy = 0; // 组件的y坐标
                add(new JLabel("学生ID:"), gbc);
                gbc.gridx = 1;
                gbc.gridy = 0;
                gbc.fill = GridBagConstraints.HORIZONTAL; // 组件水平填充
                gbc.weightx = 1.0; // 组件在水平方向上的扩展权重
                studentIdField = new JTextField();
                add(studentIdField, gbc);
                // 添加姓名
                gbc.gridx = 0;
                gbc.gridy = 1;
                add(new JLabel("姓名:"), gbc);
                gbc.gridx = 1;
                gbc.gridy = 1;
                nameField = new JTextField();
                add(nameField, gbc);
                // 添加性别
                gbc.gridx = 0;
                gbc.gridy = 2;
                add(new JLabel("性别:"), gbc);
                gbc.gridx = 1;
                gbc.gridy = 2;
                genderField = new JTextField();
                add(genderField, gbc);
                // 添加出生日期
                gbc.gridx = 0;
                gbc.gridy = 3;
                add(new JLabel("出生日期:"), gbc);
                gbc.gridx = 1;
                gbc.gridy = 3;
                birthDateField = new JTextField();
                add(birthDateField, gbc);
                // 添加学生按钮
                gbc.gridx = 0;
                gbc.gridy = 4;
                gbc.gridwidth = 2; // 组件占据两个网格宽度
                gbc.anchor = GridBagConstraints.CENTER; // 组件居中对齐
                addButton = new JButton("添加学生");
                addButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            addStudent(); // 调用添加学生信息的函数
                        } catch (SQLException ex) {
                            statusLabel.setText("数据库错误:" + ex.getMessage());
                        }
                    }
                });
                add(addButton, gbc);
                // 更新学生信息按钮
                gbc.gridx = 0;
                gbc.gridy = 5;
                updateButton = new JButton("更新学生信息");
                updateButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            updateStudent(); // 调用更新学生信息的函数
                        } catch (SQLException ex) {
                            statusLabel.setText("数据库错误:" + ex.getMessage());
                        }
                    }
                });
                add(updateButton, gbc);
                // 删除学生按钮
                gbc.gridx = 0;
                gbc.gridy = 6;
                deleteButton = new JButton("删除学生");
                deleteButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            deleteStudent(); // 调用删除学生信息的函数
                        } catch (SQLException ex) {
                            statusLabel.setText("数据库错误:" + ex.getMessage());
                        }
                    }
                });
                add(deleteButton, gbc);
                // 查看所有学生信息按钮
                gbc.gridx = 0;
                gbc.gridy = 7;
                viewButton = new JButton("显示所有学生个人信息");
                viewButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            viewStudent(); // 调用查看所有学生信息的函数
                        } catch (SQLException ex) {
                            statusLabel.setText("数据库错误:" + ex.getMessage());
                        }
                    }
                });
                add(viewButton, gbc);
            }
            private void addStudent() throws SQLException {
                String studentId = studentIdField.getText();
                String name = nameField.getText();
                String gender = genderField.getText();
                String birthDate = birthDateField.getText();
                // 检查学生ID是否为空
                if (studentId.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "学生ID不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                // 检查姓名是否为空
                if (name.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "姓名不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                // 检查性别是否为空
                if (gender.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "性别不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                // 检查出生日期是否为空
                if (birthDate.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "出生日期不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                try (Connection conn = DatabaseManager.getConnection()) {
                    // 检查学号是否已经存在
                    String checkSql = "SELECT COUNT(*) FROM Students WHERE studentId = ?";
                    try (PreparedStatement checkStmt = conn.prepareStatement(checkSql)) {
                        checkStmt.setString(1, studentId);
                        ResultSet resultSet = checkStmt.executeQuery();
                        if (resultSet.next() && resultSet.getInt(1) > 0) {
                            JOptionPane.showMessageDialog(this, "学号已经存在,无法添加学生。", "错误", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                    }
                    // 如果学号不存在,则添加新学生
                    String sql = "INSERT INTO Students (studentId, name, gender, birthDate) VALUES (?, ?, ?, ?)";
                    try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                        stmt.setString(1, studentId);
                        stmt.setString(2, name);
                        stmt.setString(3, gender);
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                        LocalDate date = LocalDate.parse(birthDate, formatter);
                        LocalDate nextDate = date.plusDays(1);
                        stmt.setDate(4, Date.valueOf(nextDate));
                        int rowsAffected = stmt.executeUpdate();
                        if (rowsAffected > 0) {
                            JOptionPane.showMessageDialog(this, "学生添加成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
                        } else {
                            JOptionPane.showMessageDialog(this, "学生添加失败!", "失败", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                } catch (SQLException e) {
                    // 更详细的异常处理
                    JOptionPane.showMessageDialog(this, "数据库错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
                }
            }
            private int updateStudent() throws SQLException {
                String studentId = studentIdField.getText();
                String name = nameField.getText();
                String gender = genderField.getText();
                String birthDate = birthDateField.getText();
                // 检查学生ID是否为空
                if (studentId.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "学生ID不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return 0; // 返回0表示更新操作失败
                }
                // 检查姓名是否为空
                if (name.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "姓名不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return 0;
                }
                // 检查性别是否为空
                if (gender.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "性别不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return 0;
                }
                // 检查出生日期是否为空
                if (birthDate.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "出生日期不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return 0;
                }
                int rowsAffected = 0;
                try (Connection conn = DatabaseManager.getConnection()) {
                    String sql = "UPDATE Students SET name = ?, gender = ?, birthDate = ? WHERE studentId = ?";
                    PreparedStatement stmt = conn.prepareStatement(sql);
                    stmt.setString(1, name);
                    stmt.setString(2, gender);
                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                    LocalDate date = LocalDate.parse(birthDate, formatter);
                    LocalDate nextDate = date.plusDays(1);
                    stmt.setDate(3, Date.valueOf(nextDate));
                    stmt.setInt(4, Integer.parseInt(studentId));
                    // 执行更新操作,并获取受影响的行数
                    rowsAffected = stmt.executeUpdate();
                    if (rowsAffected > 0) {
                        JOptionPane.showMessageDialog(this, "学生信息更新成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
                    } else {
                        JOptionPane.showMessageDialog(this, "学生信息更新失败!", "失败", JOptionPane.ERROR_MESSAGE);
                    }
                } catch (SQLException e) {
                    // 更详细的异常处理
                    JOptionPane.showMessageDialog(this, "数据库错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
                    return 0; // 返回0表示更新操作失败
                }
                // 返回受影响的行数
                return rowsAffected;
            }
            private void deleteStudent() throws SQLException {
                String studentId = studentIdField.getText();
                // 检查学生ID是否为空
                if (studentId.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "学生ID不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                try (Connection conn = DatabaseManager.getConnection()) {
                    String sql = "DELETE FROM Students WHERE studentId = ?";
                    try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                        stmt.setInt(1, Integer.parseInt(studentId));
                        int rowsAffected = stmt.executeUpdate();
                        if (rowsAffected > 0) {
                            JOptionPane.showMessageDialog(this, "学生删除成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
                        } else {
                            JOptionPane.showMessageDialog(this, "学生删除失败!", "失败", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                } catch (SQLException e) {
                    // 更详细的异常处理
                    JOptionPane.showMessageDialog(this, "数据库错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
                }
            }
            private void viewStudent() throws SQLException {
                try (Connection conn = DatabaseManager.getConnection()) {
                    // 查询所有学生个人信息
                    String sql = "SELECT * FROM Students";
                    try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                        ResultSet rs = stmt.executeQuery();
                        // 创建表格模型
                        DefaultTableModel model = new DefaultTableModel();
                        model.addColumn("学生ID");
                        model.addColumn("姓名");
                        model.addColumn("性别");
                        model.addColumn("出生日期");
                        // 填充表格
                        while (rs.next()) {
                            // 获取学生的信息
                            String studentId = rs.getString("studentId");
                            String name = rs.getString("name");
                            String gender = rs.getString("gender");
                            String birthDate = rs.getString("birthDate");
                            // 添加行数据
                            model.addRow(new Object[]{studentId, name, gender, birthDate});
                        }
                        // 创建表格
                        JTable table = new JTable(model);
                        // 创建滚动面板
                        JScrollPane scrollPane = new JScrollPane(table);
                        // 设置表格列宽
                        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
                        // 显示表格
                        JOptionPane.showMessageDialog(this, scrollPane, "学生信息", JOptionPane.INFORMATION_MESSAGE);
                    }
                } catch (SQLException e) {
                    // 更详细的异常处理
                    statusLabel.setText("数据库错误:" + e.getMessage());
                }
            }
        }
        

        ScoreManager.java

        定义了一个名为ScoreManagementPanel的类,它用于管理学生的成绩信息。这个类提供了一个图形界面,允许用户添加、根据学号查找和根据姓名查找学生的成绩。

        • 构造函数:初始化面板和组件,包括文本字段、按钮和标签。
        • addScore方法:添加学生成绩的方法,包括检查输入字段是否为空,以及与数据库的交互。
        • viewByIdScore方法:根据学号查找学生成绩的方法,包括检查输入字段是否为空,以及与数据库的交互。
        • viewByNameScore方法:根据姓名查找学生成绩的方法,包括检查输入字段是否为空,以及与数据库的交互。
          import javax.swing.*;
          import javax.swing.table.DefaultTableModel;
          import java.awt.*;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.sql.*;
          class ScoreManagementPanel extends JPanel {
              private JTextField nameField,studentIdField, mathScoreField, javaScoreField, sportsScoreField;
              private JButton addScoresButton, viewIdcoresButton,viewNameScoresButton;
              private JLabel statusLabel;
              public ScoreManagementPanel() {
                  setLayout(new GridBagLayout());
                  GridBagConstraints gbc = new GridBagConstraints();
                  gbc.insets = new Insets(5, 5, 5, 5);
                  gbc.anchor = GridBagConstraints.WEST;
                  // 添加组件
                  gbc.gridx = 0;
                  gbc.gridy = 0;
                  add(new JLabel("学生ID:"), gbc);
                  gbc.gridx = 1;
                  gbc.gridy = 0;
                  gbc.fill = GridBagConstraints.HORIZONTAL;
                  gbc.weightx = 1.0;
                  studentIdField = new JTextField();
                  add(studentIdField, gbc);
                  gbc.gridx = 0;
                  gbc.gridy = 1;
                  add(new JLabel("学生姓名:"), gbc);
                  gbc.gridx = 1;
                  gbc.gridy = 1;
                  nameField = new JTextField();
                  add(nameField, gbc);
                  gbc.gridx = 0;
                  gbc.gridy = 2;
                  add(new JLabel("数学成绩:"), gbc);
                  gbc.gridx = 1;
                  gbc.gridy = 2;
                  mathScoreField = new JTextField();
                  add(mathScoreField, gbc);
                  gbc.gridx = 0;
                  gbc.gridy = 3;
                  add(new JLabel("Java成绩:"), gbc);
                  gbc.gridx = 1;
                  gbc.gridy = 3;
                  javaScoreField = new JTextField();
                  add( javaScoreField, gbc);
                  gbc.gridx = 0;
                  gbc.gridy = 4;
                  add(new JLabel("体育成绩:"), gbc);
                  gbc.gridx = 1;
                  gbc.gridy = 4;
                  sportsScoreField = new JTextField();
                  add(sportsScoreField, gbc);
                  gbc.gridx = 0;
                  gbc.gridy = 5;
                  gbc.gridwidth = 2;
                  gbc.anchor = GridBagConstraints.CENTER;
                  addScoresButton = new JButton("添加学生分数");
                  addScoresButton.addActionListener(new ActionListener() {
                      @Override
                      public void actionPerformed(ActionEvent e) {
                          try {
                              addScore();
                          } catch (SQLException ex) {
                              statusLabel.setText("数据库错误:" + ex.getMessage());
                          }
                      }
                  });
                  add(addScoresButton, gbc);
                  gbc.gridx = 0;
                  gbc.gridy = 6;
                  viewIdcoresButton = new JButton("根据学号查找学生成绩");
                  viewIdcoresButton.addActionListener(new ActionListener() {
                      @Override
                      public void actionPerformed(ActionEvent e) {
                          try {
                              viewByIdScore();
                          } catch (SQLException ex) {
                              statusLabel.setText("数据库错误:" + ex.getMessage());
                          }
                      }
                  });
                  add(viewIdcoresButton, gbc);
                  gbc.gridx = 0;
                  gbc.gridy = 7;
                  viewNameScoresButton = new JButton("根据姓名查找学生成绩");
                  viewNameScoresButton.addActionListener(new ActionListener() {
                      @Override
                      public void actionPerformed(ActionEvent e) {
                          try {
                              viewByNameScore();
                          } catch (SQLException ex) {
                              statusLabel.setText("数据库错误:" + ex.getMessage());
                          }
                      }
                  });
                  add(viewNameScoresButton, gbc);
                  gbc.gridx = 0;
                  gbc.gridy = 8;
                  gbc.gridwidth = 3;
                  gbc.anchor = GridBagConstraints.CENTER;
                  statusLabel = new JLabel();
                  statusLabel.setHorizontalAlignment(SwingConstants.CENTER);
                  statusLabel.setForeground(Color.RED);
                  add(statusLabel, gbc);
              }
              private void addScore() throws SQLException {
                  String studentId = studentIdField.getText();
                  String mathScore = mathScoreField.getText();
                  String javaScore = javaScoreField.getText();
                  String sportsScore = sportsScoreField.getText();
                  // 检查学生ID是否为空
                  if (studentId.isEmpty()) {
                      JOptionPane.showMessageDialog(this, "学生ID不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                      return;
                  }
                  // 检查数学成绩是否为空
                  if (mathScore.isEmpty()) {
                      JOptionPane.showMessageDialog(this, "数学成绩不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                      return;
                  }
                  // 检查Java成绩是否为空
                  if (javaScore.isEmpty()) {
                      JOptionPane.showMessageDialog(this, "Java成绩不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                      return;
                  }
                  // 检查体育成绩是否为空
                  if (sportsScore.isEmpty()) {
                      JOptionPane.showMessageDialog(this, "体育成绩不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
                      return;
                  }
                  try (Connection conn = DatabaseManager.getConnection()) {
                      // 检查学号是否已经存在
                      String checkSql = "SELECT COUNT(*) FROM Scores WHERE studentId = ?";
                      try (PreparedStatement checkStmt = conn.prepareStatement(checkSql)) {
                          checkStmt.setString(1, studentId);
                          ResultSet resultSet = checkStmt.executeQuery();
                          if (resultSet.next() && resultSet.getInt(1) > 0) {
                              throw new SQLException("学号已经存在,无法添加学生。");
                          }
                      }
                      // 如果学号不存在,则添加新学生
                      String sql = "INSERT INTO Scores (studentId, math, java, sports) VALUES (?, ?, ?, ?)";
                      try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                          stmt.setString(1, studentId);
                          stmt.setInt(2, Integer.parseInt(mathScore));
                          stmt.setInt(3, Integer.parseInt(javaScore));
                          stmt.setInt(4, Integer.parseInt(sportsScore));
                          int rowsAffected = stmt.executeUpdate();
                          if (rowsAffected > 0) {
                              JOptionPane.showMessageDialog(this, "学生成绩添加成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
                          } else {
                              JOptionPane.showMessageDialog(this, "学生成绩添加失败!", "失败", JOptionPane.ERROR_MESSAGE);
                          }
                      }
                  } catch (SQLException e) {
                      // 更详细的异常处理
                      JOptionPane.showMessageDialog(this, "数据库错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
                  } catch (NumberFormatException e) {
                      JOptionPane.showMessageDialog(this, "请确保成绩字段中输入的是数字!", "错误", JOptionPane.ERROR_MESSAGE);
                  }
              }
              private void viewByIdScore() throws SQLException {
                  String studentId = studentIdField.getText();
                  // 检查学生ID是否为空
                  if (studentId.isEmpty()) {
                      JOptionPane.showMessageDialog(this, "请输入学生ID!", "错误", JOptionPane.ERROR_MESSAGE);
                      return;
                  }
                  try (Connection conn = DatabaseManager.getConnection()) {
                      // 查询学生成绩
                      String sql = "SELECT * FROM Scores WHERE studentId = ?";
                      try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                          stmt.setString(1, studentId);
                          ResultSet rs = stmt.executeQuery();
                          if (rs.next()) {
                              // 如果有记录,则显示成绩
                              JFrame frame = new JFrame("学生成绩");
                              frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                              frame.setSize(300, 200);
                              frame.setLocationRelativeTo(null); // 居中显示
                              // 创建表格模型
                              DefaultTableModel model = new DefaultTableModel();
                              model.addColumn("数学成绩");
                              model.addColumn("Java成绩");
                              model.addColumn("体育成绩");
                              // 添加行数据
                              model.addRow(new Object[]{
                                      rs.getInt("math"), rs.getInt("java"), rs.getInt("sports")
                              });
                              // 创建表格
                              JTable table = new JTable(model);
                              // 创建滚动面板
                              JScrollPane scrollPane = new JScrollPane(table);
                              // 显示表格
                              frame.getContentPane().add(scrollPane);
                              frame.setVisible(true);
                          } else {
                              // 如果没有记录,则显示错误消息
                              JOptionPane.showMessageDialog(this, "未找到该学生的成绩!", "错误", JOptionPane.ERROR_MESSAGE);
                          }
                      }
                  } catch (SQLException e) {
                      // 更详细的异常处理
                      JOptionPane.showMessageDialog(this, "数据库错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
                  }
              }
              private void viewByNameScore() throws SQLException {
                  String name = nameField.getText();
                  // 检查学生姓名是否为空
                  if (name.isEmpty()) {
                      JOptionPane.showMessageDialog(this, "请输入学生姓名!", "错误", JOptionPane.ERROR_MESSAGE);
                      return;
                  }
                  try (Connection conn = DatabaseManager.getConnection()) {
                      // 查询学生姓名
                      String studentSql = "SELECT studentId FROM Students WHERE name = ?";
                      try (PreparedStatement studentStmt = conn.prepareStatement(studentSql)) {
                          studentStmt.setString(1, name);
                          ResultSet studentRs = studentStmt.executeQuery();
                          if (studentRs.next()) {
                              // 获取学生的学号
                              String studentId = studentRs.getString("studentId");
                              // 使用学号查询学生成绩
                              String scoreSql = "SELECT * FROM Scores WHERE studentId = ?";
                              try (PreparedStatement scoreStmt = conn.prepareStatement(scoreSql)) {
                                  scoreStmt.setString(1, studentId);
                                  ResultSet scoreRs = scoreStmt.executeQuery();
                                  DefaultTableModel model = new DefaultTableModel();
                                  model.addColumn("数学成绩");
                                  model.addColumn("Java成绩");
                                  model.addColumn("体育成绩");
                                  model.addColumn("学生ID");
                                  // 添加行数据
                                  while (scoreRs.next()) {
                                      model.addRow(new Object[]{scoreRs.getInt("math"), scoreRs.getInt("java"), scoreRs.getInt("sports"), studentId});
                                  }
                                  // 创建表格
                                  JTable table = new JTable(model);
                                  // 创建滚动面板
                                  JScrollPane scrollPane = new JScrollPane(table);
                                  // 显示表格
                                  JFrame frame = new JFrame("学生成绩");
                                  frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                                  frame.setSize(300, 200);
                                  frame.setLocationRelativeTo(null); // 居中显示
                                  frame.getContentPane().add(scrollPane);
                                  frame.setVisible(true);
                              }
                          } else {
                              // 如果没有找到学生,则显示错误消息
                              JOptionPane.showMessageDialog(this, "未找到该学生的信息!", "错误", JOptionPane.ERROR_MESSAGE);
                          }
                      }
                  } catch (SQLException e) {
                      // 更详细的异常处理
                      JOptionPane.showMessageDialog(this, "数据库错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
                  }
              }
          }

          导出jar包:

          Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

          简单运行:

          Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

          Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

          Java(JavaSwing,GUI)学生信息成绩管理系统(IDEA+MYSQL)

          结尾:

          Java连接数据库中对于日期型数据的读写由于Java对date的封装其中会导致输入的和输出的日期差一天,最后通过

          DateTimeFormatter formatter= = DateTimeFormatter.ofPattern("yyyy-MM-dd");

                  LocalDate date = LocalDate.parse(birthDate, formatter);

                  LocalDate nextDate = date.plusDays(1);

                  stmt.setDate(4, Date.valueOf(nextDate)); 替换原来的 

          stmt.setDate(4, Date.valueOf(Date));

          得到了解决。

          在最后进行jar导包时,通过查询资料:

          IDEA导出jar包步骤及jar双击无法运行解决办法_idea 打包可执行jar 用java -jar 运行不了-CSDN博客

          发现可在相同目录下新建文本文档,内容为“java -jar jar包名称.jar”,编辑完成后保存,关闭文本文档,将txt后缀改为bat,文件名称随意,双击bat文件即可运行jar包。从而得到了解决。

          好的,晚安各位,忙活一天该睡喽 (¦3[▓▓] ...

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]