前情提要:
好久没发博客了...上次的蓝桥杯国赛也没白去,混了个国三,明年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[▓▓] ...