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

前情提要:

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

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

学生信息成绩管理系统:

功能描述:

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

功能框架图:

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数据库所需的所有信息,包括数据库服务器地址、端口号、数据库名称以及字符集和时区设置等。
  • USERPASSWORD:这两个字符串分别存储了数据库的登录用户名和密码。
  • 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连接数据库中对于日期型数据的读写由于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[▓▓] ...

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,那我可以为你提供一些关于Idea+Java+MySQL的图书管理系统的设计思路和实现方法。 1. 数据库设计 首先,我们需要设计一个数据库来存储图书信息。可以考虑以下几个表: - 书籍表(book):存储书籍的基本信息,包括书名、作者、出版社、价格等; - 借阅记录表(borrow_record):存储借阅记录的信息,包括借阅者ID、借阅时间、归还时间等; - 用户表(user):存储用户的信息,包括用户名、密码、性别、联系方式等。 2. Java代码实现 接下来,我们可以使用Java语言来实现图书管理系统的后端逻辑。 首先,我们需要建立与MySQL数据库的连接。可以使用JDBC来完成这个过程。 其次,我们需要实现各种业务逻辑,例如: - 添加书籍; - 删除书籍; - 修改书籍信息; - 查询书籍信息; - 借阅书籍; - 归还书籍; - 用户注册; - 用户登录等。 这些业务逻辑可以通过编写Java代码来实现。 3. 前端界面设计 最后,我们需要设计一个前端界面来实现图书管理系统的用户交互。 可以使用Java SwingJavaFX等GUI工具包来实现图形用户界面。具体可以考虑以下几个界面: - 登录界面:用于用户登录; - 注册界面:用于用户注册; - 首页:用于展示书籍列表; - 书籍详情页:用于展示书籍的详细信息; - 借阅记录页:用于展示用户的借阅记录。 以上是一个简单的Idea+Java+MySQL的图书管理系统的设计思路和实现方法。希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值