Java实现学生成绩管理系统
学生成绩管理系统项目介绍
一、项目概述
本学生管理系统基于 Java 技术栈开发,融合 GUI 界面、MySQL 数据库、JDBC 操作、线程连接池、输入输出流及 Maven 工程管理,实现学生信息的增删改查、登录验证、数据可视化展示等功能,为校园学生成绩管理提供便捷、高效的桌面应用解决方案。
二、技术栈与架构
(一)核心技术
GUI(Swing):构建可视化交互界面,包含登录窗口、主数据展示窗口,实现用户操作与系统反馈的直观交互,如登录校验弹窗、学生信息表格展示 。
MySQL:作为数据存储仓库,存储学生基础信息(学号、姓名、生日等 )、成绩数据及用户登录信息,保障数据持久化 。
JDBC:搭建 Java 与 MySQL 数据库的连接桥梁,执行 SQL 语句,完成学生信息的查询、插入、更新、删除等操作,如从数据库读取学生数据渲染到表格 。
线程连接池(Druid 连接池):优化数据库连接资源管理,避免频繁创建/销毁连接的开销,提升系统性能与稳定性,保障高并发场景(虽桌面应用并发低,但体现架构优化 )下数据库操作效率 。
日志记录:在主机本地化记录日志,有利于操作追溯,记录用户登录、数据修改等行为,追踪敏感操作(如批量删除)。入侵检测,异常日志(如高频错误登录尝试)可作为安全事件告警依据,结合防火墙规则阻断潜在攻击。
输入输出流:可用于实现数据备份(如将学生信息导出为文本文件 )、日志记录(记录系统操作、异常信息 )等功能,丰富系统数据处理能力 。
Maven:统一项目依赖管理,自动下载、管理 JDBC 驱动、Swing 相关库(若有扩展 )、连接池组件等,简化项目配置与构建流程。
正则表达式:对用户的输入进行精确校准。
Maven:利用Maven引用Junit、druid、package等jar包。
(二)架构设计
采用 MVC(模型 - 视图 - 控制器) 思想组织代码:
视图(View):由 Swing 组件构成,如 LoginView (登录界面 )、 MainView (主数据展示界面 ),负责呈现界面、收集用户输入 。
模型(Model):包含数据库操作模型(基于 JDBC、连接池 ,如 CheckViewTableModel、MainViewTableModel、MainViewTable 封装数据查询、表格模型逻辑 )、实体类(学生信息实体 ),处理数据存储、业务逻辑计算(如总成绩计算 )。
控制器(Controller):通过事件监听(如登录按钮点击事件)、方法调用,协调视图与模型交互,如 LoginView 中登录事件触发身份校验逻辑,调用模型层查询数据库验证用户 。
三、核心功能模块
(一)用户登录模块
- 界面: LoginView 提供用户名、密码输入框及“登录”“清除”按钮,简洁直观 。
- 逻辑:点击“登录”,控制器层调用模型层,通过 JDBC 连接数据库校验用户信息(对比数据库存储的用户名、密码 ),校验失败弹出提示框,成功则跳转主数据界面 。
部分代码如下:
1 | import util.SqlUtil; |
(二)学生信息管理模块
数据展示: MainView 借助 JTable 展示学生信息,结合自定义 CheckViewTableModel 加载数据库学生数据(学号、姓名、生日、各科成绩等 ), MainViewCellRender 优化表格渲染(隔行变色、文字居中 ),提升可读性 。
增删改查:可扩展实现(当前示例基础上 ),通过按钮触发事件,调用模型层执行 JDBC 操作:
部分代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class StudentsUpDate implements ActionListener {
static String receive=null;
MainView mainView;
public void actionPerformed(ActionEvent e) {
JButton jButton= (JButton) e.getSource();
String text = jButton.getText();
if(text.equals("增加")){
new ViewUtil("增加","输入 学号、姓名可添加生日或全部添加,信息用空格分隔");
}
else if(text.equals("修改")){
new ViewUtil("修改","输入 学号,可对成绩或生日或全部进行修改");
}
else if(text.equals("删除")){
new ViewUtil("删除","输入 学号");
}
else if(text.equals("查询")){
new CheckStudentView(MainView.searchText.getText());
}
}
public StudentsUpDate() {
}
public StudentsUpDate(MainView mainView) {
this.mainView = mainView;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163import util.RecognizePattenUtil;
import util.SqlUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
public class ViewUtil extends JFrame{
String method;
JTextField textField;
RecognizePattenUtil recognizePattenUtil=new RecognizePattenUtil();
boolean re=true;
public ViewUtil(String str,String patten){
super(str);
method=str;
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setSize(600, 130);
setLayout(new BorderLayout(10, 10));
JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10));
JLabel label = new JLabel(patten);
textField = new JTextField(20);
inputPanel.add(label);
inputPanel.add(textField);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 10));
JButton confirmButton = new JButton("确定");
JButton cancelButton = new JButton("取消");
confirmButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String inputText = textField.getText();
try {
f(inputText);
} catch (SQLException ex) {
ex.printStackTrace();
}
if (re){
System.out.println(textField.getText());
MainView.pubMainView.dispose();
new MainView();
dispose(); // 关闭窗口
}
re=true;
}
});
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose(); // 关闭窗口
}
});
buttonPanel.add(confirmButton);
buttonPanel.add(cancelButton);
add(inputPanel, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
setLocationRelativeTo(null);
setVisible(true);
}
public void f(String s) throws SQLException {
String[] recognize = recognizePattenUtil.recognize(s);
if(method.equals("增加")){
if(recognize.length==2){
String sql="INSERT INTO students(学号,`name`) VALUES (?,?)";
PreparedStatement preparedStatement = SqlUtil.getConnection().prepareStatement(sql);
preparedStatement.setString(1,recognize[0]);
preparedStatement.setString(2,recognize[1]);
preparedStatement.executeUpdate();
textField.setText(null);
}
else if(recognize.length==5){
String sql="INSERT INTO students(学号,`name`,birthday_year,birthday_month,birthday_day) VALUES (?,?,?,?,?)";
PreparedStatement preparedStatement = SqlUtil.getConnection().prepareStatement(sql);
preparedStatement.setString(1,recognize[0]);
preparedStatement.setString(2,recognize[1]);
preparedStatement.setString(3,recognize[2]);
preparedStatement.setString(4,recognize[3]);
preparedStatement.setString(5,recognize[4]);
preparedStatement.executeUpdate();
textField.setText(null);
}
else if (recognize.length==9){
String sql="INSERT INTO students(学号,`name`,birthday_year,birthday_month,birthday_day,chinese,math,java,PE) VALUES (?,?,?,?,?,?,?,?,?)";
PreparedStatement preparedStatement = SqlUtil.getConnection().prepareStatement(sql);
preparedStatement.setString(1,recognize[0]);
preparedStatement.setString(2,recognize[1]);
preparedStatement.setString(3,recognize[2]);
preparedStatement.setString(4,recognize[3]);
preparedStatement.setString(5,recognize[4]);
preparedStatement.setString(6,recognize[5]);
preparedStatement.setString(7,recognize[6]);
preparedStatement.setString(8,recognize[7]);
preparedStatement.setString(9,recognize[8]);
preparedStatement.executeUpdate();
textField.setText(null);
}
else {
textField.setText("添加个数只能二、五、九列顺序添加");
re=false;
}
}
else if(method.equals("修改")){
if (recognize.length==5){
String sql="update students set chinese=?,math=?,java=?,PE=? where 学号=?";
PreparedStatement preparedStatement = SqlUtil.getConnection().prepareStatement(sql);
preparedStatement.setString(1,recognize[1]);
preparedStatement.setString(2,recognize[2]);
preparedStatement.setString(3,recognize[3]);
preparedStatement.setString(4,recognize[4]);
preparedStatement.setString(5,recognize[0]);
preparedStatement.executeUpdate();
textField.setText(null);
}
else if (recognize.length==4){
String sql="update students set birthday_year=?,birthday_month=?,birthday_day=? where 学号=?";
PreparedStatement preparedStatement = SqlUtil.getConnection().prepareStatement(sql);
preparedStatement.setString(1,recognize[1]);
preparedStatement.setString(2,recognize[2]);
preparedStatement.setString(3,recognize[3]);
preparedStatement.setString(4,recognize[0]);
preparedStatement.executeUpdate();
textField.setText(null);
}
else if(recognize.length==9){
String sql="update students set name=?,birthday_year=?,birthday_month=?,birthday_day=?,chinese=?,math=?,java=?,PE=? where 学号=?";
PreparedStatement preparedStatement = SqlUtil.getConnection().prepareStatement(sql);
preparedStatement.setString(1,recognize[1]);
preparedStatement.setString(2,recognize[2]);
preparedStatement.setString(3,recognize[3]);
preparedStatement.setString(4,recognize[4]);
preparedStatement.setString(5,recognize[5]);
preparedStatement.setString(6,recognize[6]);
preparedStatement.setString(7,recognize[7]);
preparedStatement.setString(8,recognize[8]);
preparedStatement.setString(9,recognize[0]);
preparedStatement.executeUpdate();
textField.setText(null);
}
else{
textField.setText("仅支持利用学号,对于生日、四科成绩、全部除学号外的修改");
re=false;
}
}
else if(method.equals("删除")){
String sql="DELETE FROM students where 学号=?";
PreparedStatement preparedStatement = SqlUtil.getConnection().prepareStatement(sql);
preparedStatement.setString(1,s);
preparedStatement.executeUpdate();
textField.setText(null);
}
}
}新增:收集用户输入的学生信息,插入数据库并更新表格展示 。
删除:根据学号等标识删除数据库对应记录,同步刷新表格 。
修改:弹出编辑窗口,更新数据库字段 。
查询:支持按姓名筛选学生信息,调用数据库查询并渲染结果 (支持模糊搜索)。
(三)数据备份与恢复(输入输出流 )
- 备份:通过输入输出流,将数据库中学生信息按一定格式写入本地文件,实现数据离线备份 。
1 | package util; |
- 恢复:读取本地备份文件,解析数据后通过 JDBC 批量插入数据库,用于数据恢复或迁移 。
(四)提供大量数据作为测试
利用构造的GenerateUtil工具生成学上数量自定义,学生学号格式化且唯一。
代码如下
1 | import util.SqlUtil; |
(五)提供日志
(六)数据按页展示(可翻页)
(七)利用正则表达式对用户输入进行矫正
代码展示如下
1 | import java.util.Arrays; |
(八)其他小功能
(1)登出按钮
(2)登录、重置按钮,
(3)进行错误提示
(4)修改添加错误进行提示、无数据显示NoFound
四、项目优势
开发效率:Maven 统一依赖管理,自动解决 jar 包依赖,简化项目搭建与维护;Swing 快速构建桌面应用原型,满足初期需求验证 。
性能优化:线程连接池复用数据库连接,减少资源消耗,提升数据库操作响应速度;合理的 MVC 分层,降低代码耦合,便于功能扩展与 bug 修复 。
功能完备性:覆盖学生信息管理核心流程(登录、数据展示、增删改查 ),输入输出流扩展数据处理场景,适配校园多样化管理需求 。
性能优化 :通过druid线程池复用数据库连接,减少频繁创建/销毁连接的开销
数据安全 :使用PreparedStatement预编译SQL语句,防止注入攻击
用户体验 :图形化界面支持模糊查询、批量导入导出异步线程处理耗时操作(如大数据量查询)
五、适用场景与扩展方向
(一)适用场景
- 校园教务处小范围学生信息管理,快速实现数据录入、查询与统计 。
- Java 桌面应用开发教学实践,帮助学习者掌握 GUI、数据库操作、工程化构建等技术融合应用 。
(二)扩展方向
界面升级:替换为 JavaFX 开发更美观、交互性更强的界面,适配现代桌面应用体验 。
功能增强:集成报表生成(如学生成绩分析报表 )、用户权限细分(不同角色操作权限控制 )、与教务系统对接(数据同步 )等 。
部署优化:结合 Spring Boot 重构为 Web 应用,支持浏览器访问;或打包为可执行程序(如 exe、jar ),方便离线部署使用 。
本学生管理系统以 Java 技术栈为基础,整合多技术点,实现校园学生信息高效管理,既具备实践教学价值,也可作为轻量级业务系统雏形持续迭代 。