一、课程设计题目

学生信息管理系统

二、课程设计目的

数据库系统课程设计是为了配合学习数据库系统原理及应用开发而设置的,是将关系数据库理论知识转化为解决实际问题能力的重要环节。数据库系统课程设计目的在于加深对关系数据库理论知识的理解,通过使用具体的 DBMS,掌握一种实际的数据库管理系统并掌握其操作技术,熟练掌握使用数据库前端开发工具(如 VB、 C++、 Java、 JSP、 Delphi、PowerBuilder 等),进一步提高同学们运用数据库技术解决实际问题的能力。

学校每年都有新生入学、老生毕业,还有其他各种人事变动。如何有效地管理这些学生的信息,帮助学校和老师掌握学生的情况,这就是学生信息管理系统需要完成的功能。

关于本系统的设计,笔者出于对以下几点的考虑,最终敲定设计的课题为学生信息管理系统:

每个学校每个学院都有学生信息管理系统,目的是对每年入学退学转学、获得各项奖励、获得各种处分、的学生基本信息的管理,目前随着计算机的普及,使用纸质档表格记录学生信息的方式已经落伍,原因之一是纸质档难以实现对学生信息的删除,修改次数频繁也会使得纸质档不清晰,无法实现学生信息的快捷查询,原因之二是当纸质档学生信息册只有一份时,教师修改学生信息数据时需要相互传阅,麻烦耗时;当纸质学生信息册有多份时,教师仅仅有权限实现对本班学生信息的修改,学院需要统计各班的学生信息情况,而这会导致最终学期汇总时的工作量巨大。基于以上原因,学生信息管理系统的开发和设计十分有必要,考虑到这些因素,笔者最终敲定设计的课题为学生信息管理系统。

三、总体设计

3.1 实验要求

本系统主要的功能是收集学生的个人信息,以便向教师提供每个学生在校的情况。

系统的主要功能有:

1、学生个人信息输入,包括:姓名、性别、院系、生日、籍贯、生源所在地;

2、学生流动情况的输入,包括:转系、休学、复学、退学、毕业;

3、奖惩情况的输入;

4、学生个人情况查询和修改,包括流动情况和奖罚情况。

系统功能概念模型:

image-20220706194231294

3.2 本系统所运用到技术栈

版本控制系统:Git

数据库技术:MySql

后端技术:JavaBean、JavaSwing

3.3 本系统所运用到的编程工具

代码编写:Eclipse

数据库图形化管理工具:Navicat for MySQL

前端页面设计插件:windowBuilder

代码托管服务:gitee

3.4 核心技术介绍

Mysql:MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

windowBuilder:windowBuilder是一个工作在Eclipse IDE下的可视化的窗体设计插件,利用它,通过拖拽、直接属性设置等交互式的设计方式,自动生成所见即所得的界面所需要的Java代码,从而高效地完成Java GUI程序的图形用户界面的设计。在复杂的GUI界面设计上,它将显著提高开发效率,事半功倍。

Git:Git 是一个免费并且开源的分布式版本控制系统,旨在快速高效地处理从小到大所有项目的版本管理。Git 非常容易学习,低植入,高性能。因为拥有轻量的本地分支,易用的暂存区,和多工作流的特点,它超越了类似Subversion, CVS,Perforce和ClearCase的其他的 SCM 工具。简洁来说,Git是一个分布式版本控制系统。

3.5 模块介绍

数据库表设计:

学生基本信息表

image-20220706194414794

学生奖励代码表

image-20220706194650684

学生奖励信息表

image-20220706194743700

老师注册表

image-20220706194833315

学生注册表

image-20220706194852978

学生惩罚信息表

image-20220706194919226

学生惩罚代码表

image-20220706194955469

学生学籍变更信息表

image-20220706195028359

学生学籍信息变更代码表

image-20220706195053799

登录模块:

image-20220706195116178

学生首页模块:

image-20220706195315760

修改密码模块:

image-20220706195333694

学生实名认证模块:

image-20220706195428662

学生基本信息模块:

image-20220706195450635

老师首页模块:

image-20220706195513720

老师操作学生学籍信息模块:

image-20220706195529794

老师录入学生奖励信息模块:

image-20220706195547450

老师录入学生处罚信息模块:

image-20220706195602782

老师查询学生信息模块:

image-20220706195621688

3.6 设计步骤

1、在Eclipse中安装windowBuilder插件,并创建WindowBuilder工程项目。

2、在Maven官网下载jar包并导入工程。

3、打开Swing Design插件设计前端登录页面,并完成基本的注册和退出系统的后端功能。

4、设计学生系统首页和老师系统首页,并完成登录模块的登录和重置输入的后端功能。

5、设计并实现修改密码、返回登录窗口、学生信息实名认证的后端功能。

6、设计并实现老师系统中录入学生学籍变更、奖励记录、处分记录的后端功能。

7、设计并实现老师系统中查询学生信息的页面及按钮的后端功能。

8、设计并实现学生系统中查询自己学籍变更、奖励记录和处罚记录的后端功能。

四、详细设计

4.1 项目资源目录介绍

4.2 关键代码介绍

4.2.1 安装windowBuilder插件,并创建WindowBuilder工程项目

查看eclipse版本,在eclipse官网中找到与之相匹配的windowBuilder插件版本,复制对应的插件版本下载链接。在eclipse中点击Help中的Install New Software进入界面后,点击Add,将之前复制过的插件下载链接粘贴到Location输入框中,Name中填写windowBuilder(随便填,不填都可以),点击OK。点击Select All,点击Next,一路Next,后点击接受条约点击Finish,然后等待安装成功,重启Eclipse。

重启Eclipse后,新建工程,点击New-other,选择WindowBuilder-Swing Designer中的JFrame,点击Next,输入类名后点击Finish。在项目实体类中点击左下角的Design按钮,进行页面设计。

image-20220706200040199

4.2.2 在Maven官网下载jar包并导入工程

打开Maven仓库,搜索需要的jar包名称,点击所需版本的jar包之后,点击Files栏中的jar按钮,进入jar包的下载。将下载的jar包拷贝到项目的libs目录下,点击Project-properties,进入界面后点击Java Build Path,选择Libraries栏,点击Add JARs…选择libs目录下刚添加进去的jar包,点击OK后完成。如图4-3所示。

image-20220706200221107

4.2.3设计前端登录页面,并完成注册和退出系统的后端功能

前端页面的设计依赖于windowBuilder插件,在Designer设计页面设置布局后拖拽组件,在Desigen页面对应的java文件中会自动生成Javaswing代码,此处展示登录页面的部分Javaswing代码,之后不再展示前端代码:

//登录按钮板块
Login = new JFrame();
login.setBounds(100, 100, 849, 598);
login.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
login.setLocationRelativeTo(null);//将登录界面置于屏幕中间
JButton button_login = new JButton("\u767B\u5F55");
button_login.setBounds(430, 506, 94, 33);
button_login.setFont(new Font("微软雅黑 Light", Font.BOLD, 17));

从登录模块点击注册按钮后跳转到注册按钮,直接退出登录窗口,打开注册窗口即可,注册按钮实现的后端代码如下:

button_register.addActionListener(new ActionListener() {
	@Override
	public void actionPerformed(ActionEvent e) {
		new register_frame().main(null);//打开注册
		login.dispose();//关闭登录窗口
	}
});

登录页面跳转到注册页面后,用户设置用户名和新密码,以及确认新密码,获取用户输入的数据,通过所有判断条件后调用sqlUpdate实体类中的方法操作数据库,将用户输入的用户名和密码插入到相应的数据库表中。确定注册按钮的后端实现代码如下:

button_right.addActionListener(new ActionListener() {
	/*注册确认按钮实现的代码*/
	public void actionPerformed(ActionEvent e) {
		if (e.getSource()==button_right) {//用户点击了确认按钮
			/*判断用户行为,显示相应窗口*/
			if (textField_username.getText().toString().equals("")) {
				JOptionPane.showMessageDialog(null, "请输入用户名和密码","友情提示",2);//用户用户名和密码均未输入
			}else if (textField_password.getText().toString().equals("")) {
				JOptionPane.showMessageDialog(null, "请输入密码","友情提示",2);//用户未输入密码
			}else if (textField_username.getText().toString().equals("")) {
				JOptionPane.showMessageDialog(null, "请输入用户名","友情提示",2);//用户未输入用户名
			}else if (textField_rightKey.getText().toString().equals("")) {
				JOptionPane.showMessageDialog(null, "请确认密码,保证两次输入密码相同","友情提示",2);//用户未确认密码
			}else {//用户所有信息均已输入且满足确认的要求
				if (textField_rightKey.getText().toString().equals(textField_password.getText().toString())) {//两次输入密码相同
					if (comboBox_user.getSelectedItem().toString().equals("老师")) {//判断出用户类型为老师
						String sql="Insert Into register_teacher(username,password) values(?,?)";//编写sql语句
						sqlUpdate.update(sql, textField_username.getText().toString(),textField_password.getText().toString());//调用自定义函数将老师的账号和密码插入到数据库
						JOptionPane.showMessageDialog(null, "注册成功");
					}else {//判断出用户类型为学生
						String sql="Insert Into register_student(username,password) values(?,?)";//编写sql语句
						sqlUpdate.update(sql, textField_username.getText().toString(),textField_password.getText().toString());//调用自定义函数将学生的账号和密码插入到数据库
						JOptionPane.showMessageDialog(null, "注册成功");
					}
					new xt_application().main(null);//打开登录窗口
					register.dispose();//关闭注册窗口
				}else {//两次输入密码不同
					JOptionPane.showMessageDialog(null, "两次输入的密码不一致","友情提示",2);
				}
			}
		}
}}

从登录模块退出系统,实现退出按钮的功能,设计出退出按钮后,实现其后端代码,捕获到用户行为,弹出提示框,提示用户是否确定要退出系统并创建变量接收用户的点击结果,当变量为0时,说明用户点击了“是”,此时关闭系统,若变量值不为0,则不执行退出系统操作,退出系统按钮实现的后端代码如下:

/*退出按钮的代码实现*/
button_exit.addActionListener(new ActionListener() {
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO 自动生成的方法存根
		if (e.getActionCommand().toString().equals("退出")) {//捕获到用户行为
			int isExit = JOptionPane.showConfirmDialog(null, "您确定要退出系统吗?","友情提示",JOptionPane.YES_NO_OPTION);//提示用户是否要退出系统
			if(isExit==0) login.dispose();//退出系统
		}
	}
});
4.2.4 设计学生系统首页和老师系统首页,完成登录模块的登录和重置输入的后端功能

设计学生系统首页和老师系统首页直接在Design页面中拖拉组件即可,在此前端代码不再展示,不再赘述。此处主要介绍登录页面的登录和重置输入按钮的后端实现功能。

当用户点击登录按钮后,获取到用户输入的用户名、密码和下拉框中选择的登录身份。当用户选择“学生”的身份进行登录时,调用sqlUpdate实体类中的静态方法,传参为sql语句和参数,查询出学生登录表中是否有此账号,若密码错误或者账号错误则给出相应的提示信息;若账号密码正确,则关闭登录页面,打开学生系统页面。当用户选择“老师”的身份进行登录时,代码类似,只是查询数据时是在老师登录表中查询是否有此账号。登录按钮实现的后端代码如下(注意:由于老师登录的代码与学生登录的代码类似,此处不再展示老师登录的代码):

public void actionPerformed(ActionEvent e) {
	String name=user_text.getText().toString();//用户名
	String key=key_text.getText().toString();//密码
	String idtf=user_type_comboBox.getSelectedItem().toString();
	if (e.getActionCommand().equals("登录")) {
		if (name.isEmpty()&&!key.isEmpty()) {//用户未输入用户名,只输入了密码
			JOptionPane.showMessageDialog(null,"用户名不能为空","友情提示",2);//弹出用户名为空的提示性对话框
		}else if (key.isEmpty()&&!name.isEmpty()) {//用户只输入了用户名而未输入密码
			JOptionPane.showMessageDialog(null, "密码不能为空","友情提示",2);//弹出密码为空的提示性对话框
		}else if (key.isEmpty()&&name.isEmpty()) {//用户均未输入用户名和密码
			JOptionPane.showMessageDialog(null, "用户名和密码不能为空","友情提示",2);//弹出用户名和密码均为空的提示性对话框
		}else {
			if (idtf.equals("学生")) {//当用户类型为学生时
				try {
					if (name.equals(sqlUpdate.user_Query("select username from register_student where username=?", name))) {//在数据库中查询到指定用户名
						if (key.equals(sqlUpdate.pwd_Query("select password from register_student where password=?", key))) {//在数据库中查询到用户名所对应的密码
							stu_menu_frame f=new stu_menu_frame();//由于getId()未设置为静态方法,故必须新设对象一调用getId()方法
							f.getId(sqlUpdate.id_Query("select id from register_student where username=?", name));//调用stu_menu_frame中的getId()方法,达到传参的目的
							new stu_menu_frame().main(null);//验证身份成功,登录成功
							login.dispose();//关闭登录页面
						}else {
							JOptionPane.showMessageDialog(null, "密码错误,请重新输入","友情提示",2);//密码错误,验证身份失败,登录失败
						}
					}else {
						JOptionPane.showMessageDialog(null, "用户名不存在","友情提示",2);//用户名不存在或者用户类型不符合
					}
				} catch (HeadlessException e1) {
					// TODO 自动生成的 catch 块
					e1.printStackTrace();
				} catch (Exception e1) {
					// TODO 自动生成的 catch 块
					e1.printStackTrace();
				}
			}
}

当用户点击登录界面的重置按钮后,将用户名和密码输入框置空,并将下拉框的选项置为初始值。重置按钮的后端实现代码如下:

public void actionPerformed(ActionEvent e) {
	user_text.setText("");/*将输入框置空*/
	key_text.setText("");
		user_type_comboBox.setSelectedIndex(0);
	}
});
4.2.5设计并实现修改密码、返回登录窗口、学生信息实名认证的后端功能

创建变量保存登录页面传来的用户id,保证之后所有的操作都是围绕此用户的信息。当用户点击菜单项修改密码按钮时,将id进行传参到menu_frame类中,打开修改密码的窗口,关闭学生系统首页的窗口。由于点击菜单项打开新窗口的代码逻辑类似,在此仅展示点击修改密码按钮后的页面跳转逻辑,之后类似操作不再赘述,点击修改密码按钮的后端代码实现:

public void mousePressed(MouseEvent e) {
	// TODO 自动生成的方法存根
	if (e.getSource()==menuItem_change_key) {//捕获到用户点击了菜单项修改密码的按钮
		stu_change_key_frame change_key=new stu_change_key_frame();//由于change_key_frame类中的getId()方法不是静态方法,所以必须先创建对象
		change_key.getId(s_id);//调用getId()传参
		new stu_change_key_frame().main(null);//打开修改密码的窗口
		menu_frame.dispose();//关闭菜单窗口
	}
}

当用户点击返回登录页面菜单项时,代码逻辑打开登录窗口并关闭菜单窗口即可,逻辑简单,不再赘述。

当用户点击学生信息实名认证的菜单项时,向实名认证的类中传参id,调用sqlUpdate类中的静态方法查询数据库学生信息表中是否存在此id号学生的信息,若方法返回值不为0,则说明该用户信息已经足够完善,无需再完善信息;若方法返回值为0,则说明学生信息表中不存在此id号的学生信息,需要进行实名认证,打开完善信息的页面,点击实名认证菜单项的后端代码实现如下:

public void mousePressed(MouseEvent e) {
	// TODO 自动生成的方法存根
	if (e.getSource()==menuItem_confirm) {
		try {
			confrim_frame confrim=new confrim_frame();//由于getId()并没有设置为confrim_frame类中的静态方法,所以必须新建立对象才能调用方法
			confrim.getId(s_id);//向confrim_frame类中传参
			/*isId是id_Query()方法的返回值,若数据库中已存在该s_id号,方法返回值为id值,说明在此之前用户已经完善过信息,无需完善,若方法返回0值,说明此前用户未完善信息*/
			int isId = sqlUpdate.id_Query("select id from student where id=?", s_id);//查找数据库中是否存在登录界面传来的id号
			if (isId!=0) {//若id号存在说明该用户无需完善信息
				JOptionPane.showMessageDialog(null, "信息已足够完善","友情提示",2);
			}else {//若id号不存在说明该用户是新用户,需要完善信息
				new confrim_frame().main(null);//打开完善信息页面
			}
		} catch (Exception e2) {
			// TODO: handle exception
			e2.printStackTrace();
		}
	}
}
4.2.6设计并实现老师系统中录入学生学籍变更、奖励记录、处分记录的功能

当老师点击录入信息中的学籍变更菜单项时,关闭教师管理系统窗口,打开修改学籍信息的窗口,老师输入学号后点击查询,编写sql语句并执行,查询学生信息表中的相关信息,将查询到的相应信息放入相应的标签当中,达到数据回显的目的,然后老师输入学籍代码点击修改后,通过一系列判断后,查询到用户输入的学籍代码所对应的学生学籍变更信息,编写sql语句并执行,修改或者增添数据库中学生学籍信息表数据,修改学籍信息菜单项的后端代码实现如下:

public void actionPerformed(ActionEvent e) {
	if (e.getSource()==button_change&&textField_CODE.getText().toString().isEmpty()) {//当用户未输入级别代码却点击了修改按钮
		JOptionPane.showMessageDialog(null, "请您输入级别代码","友情提示",2);//弹出提示窗口
	}else if (e.getSource()==button_change&&label_getStuId.getText().toString().isEmpty()) {//当学号标签上未显示内容,但用户点击了修改按钮
		JOptionPane.showMessageDialog(null, "请您先查找指定学生","友情提示",2);//弹出提示窗口
	}else {
		int code = Integer.parseInt(textField_CODE.getText().toString());//获取用户输入在文本框内的学籍代码,并将其转换为int类型
		String StuId = textField_getStuId.getText().toString();//获取用户输入在文本框内的学号
		int id=0;
		try {
			id = sqlUpdate.id_Query("select ID from student where s_studentid=?", StuId);//查找到相应学号的同学的id号
		} catch (Exception e2) {
			// TODO 自动生成的 catch 块
			e2.printStackTrace();
		}//获取查询同学的id号
		if (e.getSource()==button_change) {//捕获到用户点击了修改按钮
			if (flag1==1) {
				if (code<0||code>4) {
					JOptionPane.showMessageDialog(null, "您输入的学籍代码错误,请输入0~4之间的数字","友情提示",2);
				}else {
					if (flag2==1) {//该学生在学籍信息的数据库中有记录,只需修改学籍信息,而无需增添信息到数据库
						sqlUpdate.update("update change_information set CHANGE_CODE=? where STUDENTID=? ", code,StuId);//修改数据库中的内容
						String DESCRIPTION="";
						try {
							DESCRIPTION = sqlUpdate.description_Query("select DESCRIPTION from change_code where code=?", code);//调用函数查询到code对应的学籍状态
						} catch (Exception e1) {
							// TODO 自动生成的 catch 块
							e1.printStackTrace();
						}
						sqlUpdate.update("update change_information set DESCRIPTION=? where STUDENTID=?", DESCRIPTION,StuId);//将数据库中DESCRIPTION的内容修改
						label_getXjZt.setText(DESCRIPTION);//将标签的内容修改
						label_getXjCODE.setText(String.valueOf(code));//更新标签上的内容
						
						java.util.Date date=new java.util.Date();//获取点击按钮的当前时间
						SimpleDateFormat dateFormat=new SimpleDateFormat("YYYY-MM-dd");//设置时间的格式
						label_getTime.setText(dateFormat.format(date));//修改标签上的内容
						sqlUpdate.update("update change_information set REC_TIME=? where STUDENTID=?", dateFormat.format(date),StuId);//更改数据库中的内容
					}else {
						String DESCRIPTION="";
						try {
							DESCRIPTION = sqlUpdate.description_Query("select DESCRIPTION from change_code where code=?", code);//调用函数查询到code对应的学籍状态
						} catch (Exception e1) {
							// TODO 自动生成的 catch 块
							e1.printStackTrace();
						}
						label_getXjZt.setText(DESCRIPTION);//将标签的内容修改
						label_getXjCODE.setText(String.valueOf(code));//更新标签上的内容
						java.util.Date date=new java.util.Date();//获取点击按钮的当前时间
						SimpleDateFormat dateFormat=new SimpleDateFormat("YYYY-MM-dd");//设置时间的格式
						label_getTime.setText(dateFormat.format(date));//修改标签上的内容
						/*向*/
						sqlUpdate.update("insert into change_information(ID,STUDENTID,CHANGE_CODE,REC_TIME,DESCRIPTION) values(?,?,?,?,?)", id,StuId,code,dateFormat.format(date),DESCRIPTION);
						flag2=1;
					}
					JOptionPane.showMessageDialog(null, "修改成功","友情提示",2);//弹出修改成功的提示窗口
				}
			}else {
				JOptionPane.showMessageDialog(null, "未查询到该学生,故您无法修改学籍信息","友情提示",2);
			}
		}
	}
}});

老师录入学生奖励记录和处罚记录的代码逻辑和录入学籍信息的类似,再次不再赘述。

4.2.7 设计并实现老师系统中查询学生信息的页面及按钮的后端功能

设计学生信息查询页面同样是使用windowBuilder组件进行设计,不再赘述。当输入查询条件后,点击查询按钮,根据用户输入的数据进行判断,通过数据类型来编写sql语句(不得不说,我认为这是整个项目自己当时写的最烂的一部分代码了,代码复用性特别差,完全可以封装成函数,把获取参数添加到集合中去,然后遍历集合就好了,for循环中可以使用判断语句然后拼接字符串最终把sql语句拼接好,然后进行传参就好),然后调用类中的方法进行传参。从数据库表中查询到信息后放入表格标签中,实现数据显示,然后每点击一次查询就清空一次表格数据,防止点击查询导致数据在表格中的追加而不是查询显示。另外,在表格右下角设计了刷新按钮,此按钮的目的是清空表格内容(其实我感觉是多此一举的功能,因为每点击一次查询,在显示出学生信息之前就会将表格内容清空),实现逻辑就是调用model中的setRowCount函数,使得表格中行数置0,数据清空。查询学生信息的代码展示一部分吧(实在太烂太长复用性太差,就不展示全部代码了),查询学生信息的部分代码如下:

//若用户只输入了性别一栏信息
model.setRowCount( 0 );//将表格的行数置为0,实现每点击查询按钮一次,表格就清空一次
String sex=comboBox_getSex.getSelectedItem().toString();
List<Student> list = null;//存放学生变量
try {
	list = sqlUpdate.Student_Query("select * from student where s_sex=?", sex);//查找数据库中性别全为sex的学生
} catch (Exception e1) {
	// TODO 自动生成的 catch 块
	e1.printStackTrace();
}
for (int i = 0; i < list.size(); i++) {//遍历集合,将每一个同学的基本信息输入到表格中
	try {//将查询到相应学号的学生的奖惩信息赋值予对象的相应属性
		list.get(i).setXj_information(sqlUpdate.xj_rReward_Punish_query("select DESCRIPTION from change_information where STUDENTID=?", list.get(i).getStudentId()));
		list.get(i).setReward_information(sqlUpdate.xj_rReward_Punish_query("select DESCRIPTION from reward where STUDENTID=?", list.get(i).getStudentId()));
		list.get(i).setPunish_information(sqlUpdate.xj_rReward_Punish_query("select DESCRIPTION from punishment where STUDENTID=?", list.get(i).getStudentId()));
		list.get(i).setIsRight(sqlUpdate.IsPunish_query("select ENABLE from punishment where STUDENTID=?", list.get(i).getStudentId()));
	} catch (Exception e2) {
		// TODO: handle exception
		e2.printStackTrace();
	}
	/*提取出学生的奖惩属性赋值给新的变量*/
	String xj_information = list.get(i).getXj_information();
	String reward_information = list.get(i).getReward_information();
	String punish_information = list.get(i).getPunish_information();
	String isRight = list.get(i).getIsRight();
	/*提取出学生的基本属性赋值给新的变量*/
	int studentId = list.get(i).getStudentId();
	String name = list.get(i).getName();
	String sex2 = list.get(i).getSex();
	int classid = list.get(i).getClassid();
	String collage = list.get(i).getCollage();
	String born = list.get(i).getBorn();
	String resident = list.get(i).getResident();
	/*设置表格中的行内容*/
	Object[] data=new Object[] {studentId,name,sex2,classid,collage,born,resident,xj_information,reward_information,punish_information,isRight};
	model.addRow(data);
4.2.8 设计并实现学生系统中查询自己学籍变更、奖励记录和处罚记录的功能

学生系统中查询学籍变更、奖励记录和处罚记录的功能其实十分类似,因为学生是没有录入自己奖励记录和处罚记录的功能的,这个操作只能由老师实现,所以仅仅是一个数据回显的实现,所以后端查询数据库,前端获取到数据后,将数据放入标签中显示在页面中即可。当用户点击查询信息中的学籍变更菜单项时,将学生系统页面关闭,打开学籍变更信息页面,在页面中可以看到数据库中查询到的信息。代码逻辑是当用户点击了菜单项跳转页面时就把学生id进行传参,然后在方法体中编写sql语句,将id作为查询条件进行查询学生的学号、姓名、学籍代码、学籍状态和更新时间等信息,并将这些信息放入到标签当中,以此在页面中可以显示出来。查询学生学籍变更信息的后端代码实现如下:

try {
	Connection con = connection.getConnection();
	String sql="select STUDENTID,CHANGE_CODE,REC_TIME,DESCRIPTION from change_information where ID=?";
	PreparedStatement statement=con.prepareStatement(sql);
	statement.setInt(1, s_id);
	ResultSet set = statement.executeQuery();
	if (set.next()) {
		label_getStuId.setText(String.valueOf(set.getInt(1)));//学号
		label_getCODE.setText(set.getString(2));//学籍代码
		label_getDes.setText(set.getString(4));//学籍状态
		label_getTime.setText(set.getString(3));//更新时间
		label_getName.setText(sqlUpdate.name_query("select s_name from student where id=?", s_id));//姓名
	}
} catch (Exception e) {
	// TODO: handle exception
	e.printStackTrace();
}

五、结果与分析

最终项目成型,学生信息管理系统目前未发现任何bug,项目实现了任务指导书中的所有基本功能,此项目有拓展功能存在,但此项目中存在很多不足之处,以下一并进行分析。

项目拓展功能:

①登录注册和修改密码的功能,任务指导书上并没有对这个功能做要求,笔者认为登录注册功能是系统所必需的基本功能,感觉没有登录注册功能的系统是不完善的系统,所以项目中分别设计了老师登录表和学生登录表,在前端可以判断出用户身份,并对两张表进行新增数据和查询数据。修改密码功能则是对两张表进行修改数据。

②退出系统的功能:这个功能任务指导书上也没有要求,但功能十分简单,所以就一并实现了。因为整个系统都是在原有页面上打开的新页面,所以只需将当前页面窗口关闭即可实现退出系统功能。

③返回登录页面的功能:此功能也十分简单,和退出功能十分类似,只需要关闭当前页面窗口,打开登录页面即可,也就是简单的页面跳转。

项目功能不足之处:

①项目整体架构不好,只是单独的Java文件,没有面向接口编程,没有利用好项目的三层架构。

②没有封装好函数,代码过于冗余,代码复用性不好,更新功能或完善功能较为困难。

③前端页面是利用组件设计,但在一开始没设置布局,某些页面在显示数据字数过多时会导致标签错位。且前端页面不够美观。

④Jar包没全部保存在libs目录下,整个项目是引入的外部jar包,这会导致更改项目路径后,出现jar包缺失的情况。

⑤项目中判断语句过多,代码阅读性差(但还好注释比较多)。

⑥类似于dao层的sqlUpdate文件中的代码并没有很好地完成它的功能,很多sql语句是其他文件传参进来的,而应该的是sql语句在dao层编写才对。

⑦涉及到输入数据的部分,大多都是采用的输入框形势,并且没有对输入的数据进行校验,一旦用户输入了非法数据(数据类型和数据库存储的数据类型不一致)就会导致报错,可以说输入数据部分及其不完善。

六、小结与心得体会

谈到项目功能的不足之处还是比较多的,这是当时学完Java后就做的第一个Swing项目作为练手,当时的主要目的是熟悉类、静态方法等基础知识点,所以这个项目并不成熟,代码也过于冗余,复用性不好

但是通过这个项目,学习前后端交互知识还是及其不错的,它是原生的jdbc加载驱动连接数据库的,这些基础打牢了再去学习一些框架就会轻松许多。另外,该项目能很好地锻炼到Java基础知识点,因为笔者是学完Java就写的这个项目练手,当时对于类、继承和静态方法等一些不太明白不太熟练的点,这个项目作为练手是很好的选择。为什么不更新这个项目呢(也就是为什么不把不足之处进行完善)?笔者已经说过,该项目没有采用面向接口编程,没有利用好三层架构,函数封装的也不够好,代码冗余性、复用性以及阅读性都不够好,在此基础上进行更新完善功能,笔者觉得意义不大,因为项目本身就是当时学完Java练手写的,目的是熟悉Java的基础知识,显然目的是达到了的,笔者觉得这就足够了。

通过此项目,还是很好的学习到了数据库技术,对于sql语句的编写,数据库的连接方法,数据库图形化工具的使用,数据库建模工具的使用,Java基础知识都有所熟练,为之后框架的学习打下了良好的基础。

体会

谈到项目功能的不足之处还是比较多的,这是当时学完Java后就做的第一个Swing项目作为练手,当时的主要目的是熟悉类、静态方法等基础知识点,所以这个项目并不成熟,代码也过于冗余,复用性不好

但是通过这个项目,学习前后端交互知识还是及其不错的,它是原生的jdbc加载驱动连接数据库的,这些基础打牢了再去学习一些框架就会轻松许多。另外,该项目能很好地锻炼到Java基础知识点,因为笔者是学完Java就写的这个项目练手,当时对于类、继承和静态方法等一些不太明白不太熟练的点,这个项目作为练手是很好的选择。为什么不更新这个项目呢(也就是为什么不把不足之处进行完善)?笔者已经说过,该项目没有采用面向接口编程,没有利用好三层架构,函数封装的也不够好,代码冗余性、复用性以及阅读性都不够好,在此基础上进行更新完善功能,笔者觉得意义不大,因为项目本身就是当时学完Java练手写的,目的是熟悉Java的基础知识,显然目的是达到了的,笔者觉得这就足够了。

通过此项目,还是很好的学习到了数据库技术,对于sql语句的编写,数据库的连接方法,数据库图形化工具的使用,数据库建模工具的使用,Java基础知识都有所熟练,为之后框架的学习打下了良好的基础。

以上为本次课程设计的小结与心得体会,皆为真实感受,不管以后走的多远,学的东西有多杂,Java、Mysql的基础知识部分还是要时常温习,基础坚决要打牢,然后学习过新技术后要注意找项目练手,这样才能对新知识进一步熟练掌握。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐