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数据库所需的所有信息,包括数据库服务器地址、端口号、数据库名称以及字符集和时区设置等。
- 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连接数据库中对于日期型数据的读写由于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[▓▓] ...