这学期学了Java程序设计,当然是最基础的部分。。结课作业就是自己实现一个简单的系统或者算法,在网上找了一些资料,然后扩展了一下,最终做出来了一个最简单的教务管理系统。适合新手练手用,所以打算写下来可以对一些人有帮助。其中主要就是用到了Java中的swing做界面,结合数据库来实现信息的查询。(最后得了97分呦,哈哈哈)

最后我会附上全部代码的,下面这些讲解几乎是从我的课程报告上copy下来的,要写报告的同学们也可以参考一下。

学生管理系统参考博客

数据库连接方法

系统主要功能

1、此管理系统可以让用户以学生或者老师的身份进行登录;
2、学生界面显示学生的姓名和学号,并且可以查询自己的考场信息、考试成绩,还可以根据自己的需求修改登录密码;
3、教师界面显示教师的姓名和教工号,并且可以查询个人信息,包括:性别、工资、职称、所教学的科目等等,还可以输入学生的学号来查询自己所教课程的分数并且对其进行修改;
4、学生和教师的信息都存储在数据库中,要求Java程序可以连接数据库来实现登录、查询、修改等操作。

下面是一个整体设计思路的流程图:
整体的设计思路

系统设计

(1) 数据库
此学生管理系统的所有信息都以表格的形式存放在名为jsp的数据库中,包括存放学生信息的学生表(Student),其中包含学生的身份、姓名、学号、用户名、密码、成绩信息和考场信息等;存放教师信息的教师表(Teacher),其中包含教师的身份、姓名、教工号、用户名、密码、性别、职称、工资、年龄、所教科目等信息。用于后面登录功能、查询功能的实现。表格的部分数据如下图所示:
a) 学生表(Student):
在这里插入图片描述
b) 教师表(Teacher):
在这里插入图片描述
注:其中的姓名、成绩、工资等信息均为虚构
(2) 登录界面
*a) 功能:*登录界面可以输入用户名和密码来实现用户的登录,而且可以选择不同的身份来登录(学生或教师);在输入用户名和密码登录的过程中,要对用户名和密码进行匹配判断此用户是否可以登录进入学生或者教师界面,所以此处实现数据库jsp的连接,并使用Student和Teacher表格中的信息;

*b) 设计:*此处即后面都是利用到了Java的swing包和awt包等来实现可视化界面,利用了其中的各种组件来实现自己想要的界面形式。登录界面要有一个普通文本框(JTextField)来输入用户名,一个特殊的密码文本框(JPasswordField)来输入登录密码,需要有两个单选按钮(JRadioButton)来判断登录者是学生或者教师,3个单击按钮(JButton)来进行动作的监听与响应,分别为登录、重置和退出3个按钮,并且最后用面板(JPanel)将各组件结合起来显示在窗口上。
(3) 学生界面
*a) 功能:*学生界面可以显示该学生的姓名和学号,并可以通过单击查询考场、查询成绩按钮来查询自己的考场信息和考试成绩,还可以单击修改密码按钮来修改自己的登录密码,此处连接了数据库jsp并使用存储在Student表格中的信息;

*b) 设计:*首先在登录时获取学生的姓名和学号,并作为创建学生界面的参数,使用标签(JLabel)显示在界面上方;接着需要有4个单击按钮(JButton)分别为查询考场、查询成绩、修改密码和退出系统;在查询考场按钮下方插入一个表格(JTable)用来显示考场的信息,当点击查询考场时该学生的考场信息会显示在表格中;在查询成绩按钮的下方插入一个表格来显示成绩信息,当点击查询成绩按钮时该学生的考试成绩会显示在表格中;当点击修改密码按钮时会弹出一个修改密码的界面,下面将会详细介绍;当点击退出系统的时候,所有界面都会关闭。
(4) 教师界面
*a) 功能:*教师界面可以显示教师的姓名和教工号,并可以通过单击个人信息来查询自己的信息,例如:工资、职称、年龄、所教课程等;通过输入某个学生的学号来查询该名老师所教课程这个学生的分数;单击修改成绩可以修改该学生的成绩;此处连接了数据库jsp并使用了存储在Student和Teacher表格中的信息;

*b) 设计:*首先在登录时获取教师的姓名和教工号,并作为创建教师界面的参数,使用标签(JLabel)显示在界面上方,接着需要4个单击按钮(JButton)分别为查询个人信息、查询成绩、修改成绩和退出系统;在查询个人信息按钮下方插入一个表格(JTabel)用来显示教师的个人信息,当单击个人信息按钮时该教师的个人信息会显示在表格中;在查询成绩按钮前面加入一个普通文本框(JTextField)用来输入学生学号,在下面插入一个表格用来显示成绩信息,当点击查询成绩时,会根据输入的学号来查询该名同学的成绩信息并显示在下方的表格中;当单击修改成绩按钮时会弹出一个修改成绩的界面,下面会详细介绍;当点击退出系统按钮时,所有界面将会关闭。
(5) 修改密码界面
*a) 功能:*通过输入原密码和新密码来实现学生登录密码的修改;

*b) 设计:*主要是使用3个文本框,1个普通的文本框来输入原密码,另外2个密码文本框用来输入新密码和确认密码,后面还设有3个单击按钮分别为确认修改、退出修改和重置,当3个文本框中的输入的密码均满足要求,点击确认修改即可修改当前密码为新密码。
(6) 修改成绩界面
*a) 功能:*通过输入一个分数来对学生原分数进行修改;

*b) 设计:*使用到1个普通文本框输入想要修改的成绩,并且此处成绩不能小于0大于100;后面设有3个单击按钮分别为确认修改、重置和退出修改,当在文本框中输入一个满足条件的分数,点击确认修改之后就可以将此学生成绩修改。

系统实现

(1) 连接数据库
由于这个系统需要一个工具来存储学生和教师的信息,通过查阅资料我发现通过数据库的连接是个很不错的方法。此系统最重要的一个步骤就是连接存储信息的数据库。所以就按照这个思路往下进行,在网上找到了用java连接数据库的方法,操作如下:
a) 首先设置sa用户登录到sql server 2008,设置用户名以及密码,并授权允许连接到数据库。此处我的用户名没有修改,为sa,密码修改为***;(这个密码自己设置哈)
b) 利用SQL Server配置管理器对TCP/IP等进行修改,设置环境变量,下载sqljdbc4.jar文件并将其加入到对应的文件夹当中;
c) 设置好数据库的驱动等信息,为下面连接数据库做准备,主要代码如下:

// 数据库驱动
static String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
static String dbURL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=jsp";
// 数据库用户名和密码
static String userName="sa";
static String userPwd="***";

// 数据库连接、sql语句、结果集等对象
	static Connection ct = null;
	PreparedStatement ps = null;
	ResultSet rs = null;

(2) 登录界面实现
首先将登录界面的框架设计好,根据我们前面的设计,然后继承JFrame创建一个窗口,往上添加各种组件,实现我我们想要的界面样式,如下图所示:

当将界面的基本框架搭好之后,接下来进行数据库的连接,代码如下:

public static void main(String[] args){
		// 创建登录界面
		Login login = new Login();	
		// 进行数据库的连接
		try {
			Class.forName(driverName);
			ct=DriverManager.getConnection(dbURL, userName, userPwd);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

接下来以学生登录为例讲解实现的过程(教师登录的过程类似),当输入好用户名和密码之后,选择身份为学生,然后点击登录按钮,此时就会调用定义的动作监听函数actionPerformd将输入的用户名和密码与数据库中的进行匹配,判断是否能够成功登录学生系统,如果不能登录,则反馈给用户不能登录的原因,函数主体如下:

public void actionPerformed(ActionEvent e){	
		if(e.getActionCommand() == "登录"){			
if(jrb_2.isSelected()) {  // 学生登录
				try {
			         ps = ct.prepareStatement("select * from Student
 where 身份=? and 用户名=?");
					//给?赋值(按照身份为学生、用户名为输入的用户名查询)
					ps.setString(1, "学生");
					ps.setString (2, jtf.getText());
					//ResultSet结果集
					rs=ps.executeQuery();
					if(rs.next()){
						//将学生的用户名、密码、姓名、学号取出
						user_name = rs.getString(2);
						password = rs.getString(3);					 
						stu_name = rs.getString(5);
						sno = rs.getString(4);						 
						stu_login();
					}else {
	JOptionPane.showMessageDialog(null, "没有此用户或用户名为空!\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
					}
				} catch (SQLException e1) {					
					e1.printStackTrace();
				}												
			}
		}else if(e.getActionCommand() == "重置"){	
			clear();	        // 清除文本框里的内容	
		}else if(e.getActionCommand() == "退出"){		
			System.exit(0);		// 结束程序,关闭所有窗口
		}	
	}

当点击登录按钮之后,函数就会根据设置的sql语句在Student表格中查询想要的数据记录,如果数据库中没有这个用户名或者没有输入用户名,就会提示一条信息;如果数据库中有这个用户那么就将得到数据先存储在String变量中,分别为用户名(user_name),密码(password),学生姓名(stu_name)和学号(sno),紧接着调用学生登录判断的函数stu_login()如下所示,只有当输入的用户名和密码和数据库中的相匹配才会显示登录成功并弹出学生界面,否则则会根据错误类型进行相关的提示。

// 学生登陆判断方法
public void stu_login(){
if(user_name.equals(jtf.getText()) && password.equals(String.valueOf(jpf.getPassword()))){
	JOptionPane.showMessageDialog(null, "登陆成功!", "提示消息", JOptionPane.WARNING_MESSAGE);		
			clear();		
			dispose();			// 关闭当前登录界面
			Student stu = new Student(stu_name, sno); // 创建学生界面并显示
		}else if(jtf.getText().isEmpty() && String.valueOf(jpf.getPassword()).isEmpty()){	
			JOptionPane.showMessageDialog(null, "请输入用户名和密码!", "提示消息", JOptionPane.WARNING_MESSAGE);	
		}else if(jtf.getText().isEmpty()){		
			JOptionPane.showMessageDialog(null, "请输入用户名!", "提示信息", JOptionPane.WARNING_MESSAGE);	
		}else if(String.valueOf(jpf.getPassword()).isEmpty()){		
			JOptionPane.showMessageDialog(null, "请输入密码!", "提示信息", JOptionPane.WARNING_MESSAGE);		
		}else{			
			JOptionPane.showMessageDialog(null, "用户名或者密码错误!\n请重新输入", "提示信息", JOptionPane.ERROR_MESSAGE);
			clear();			
		}
	}

(3) 学生界面实现
根据前面的学生界面的设计,将相应的插件加入到窗口实现学生界面,如下图所示:
在这里插入图片描述
为了查看效果,此处我用了自己的姓名和学号来初始化的这个界面,从界面我们可以看到姓名和学号可以显示,并且有4个按钮和2个表格,此处以查询考场为例讲解查询的过程(查询成绩与其类似),当点击考场查询按钮,相应的动作响应函数就会从数据库中获取到相应的考场信息并将其显示在下方的表格中,具体的响应函数如下:

// 动作事件监听函数
public void actionPerformed(ActionEvent e){
	if(e.getActionCommand() == "考场查询"){
		try{		
			ps = ct.prepareStatement("select * from Student where 学号 =? ");
			ps.setString(1, Sno);	// 给?赋值,用setString将设置SQL语句按照学号Sno查询	
			rs = ps.executeQuery(); //将对应学号的每一行信息放在ResultSet中
				// 获取对应学号的学生考场信息
				while(rs.next()){
					math_room = rs.getString(10);				
					c_room = rs.getString(11);				
					java_room = rs.getString(12);				
					english_room = rs.getString(13);	
				}				
			}catch (Exception e1) {					
			e1.printStackTrace();
			}
			// 将考场信息加入表格
			jtable_1.setValueAt(math_room, 0, 0);
			jtable_1.setValueAt(c_room, 0, 1);
			jtable_1.setValueAt(java_room, 0, 2);
			jtable_1.setValueAt(english_room, 0, 3);	
		}else if(e.getActionCommand() == "修改密码"){
			ChangePassword cp = new ChangePassword(Sno);  //弹出修改密码界面
		}else if(e.getActionCommand() == "退出系统"){
			System.exit(0);        // 结束程序,所有窗口关闭
		}	
}

点击考场查询按钮之后,就会根据设置好的sql以该学生学号来查询Student表中的考场信息,并将这些信息赋值给变量存储起来,分别为高数考场(math_room)、C语言考场(c_room)、java考场(java_room)和英语考场(english_room),然后将这些考场信息加入到表格jtable_1中,从而显示出来;
当点击修改密码按钮,就会创建一个修改密码的窗口cp,对于这个窗口的实现下面将会讲到。
(4) 教师界面实现
同样根据前面教师界面的设计,将各种组件插入到窗口得到教师界面如下图所示:
在这里插入图片描述

为了查看效果,此处我还是用了自己的姓名和学号进行初始化。从界面我们可以看到教师的姓名、教工号,并且有4个按钮和2个表格,当点击个人信息按钮的时候,教师的个人信息就会显示在下面的表格中;当在文本框中输入一个学生的学号并点击查询成绩,对应学号的学生信息和成绩就会显示在下面的表格中;当点击修改成绩按钮,就会弹出一个修改成绩的界面;由于个人信息的显示和学生界面的显示类似,此处就不过多讲解,主要来讲解按照学号来查询成绩的过程,主要代码如下:

// 动作响应函数
public void actionPerformed(ActionEvent e){
if(e.getActionCommand() == "查询成绩"){   // 想查询哪个学生的成绩(输入其学号)		
	sno = jtf.getText();
	try{
		ps = ct.prepareStatement("select * from Student where 学号 =? ")	
		ps.setString(1, sno);							
		rs = ps.executeQuery();					
		// 获取对应学号的学生成绩(根据此教师所教的科目)
		while(rs.next()){						
			stu_name = rs.getString(5);
			if(subject.equals("高数"))
				grade = rs.getString(6);
			else if(subject.equals("C语言"))
				grade = rs.getString(7);
			else if(subject.equals("Java"))
				grade = rs.getString(8);
			else if(subject.equals("英语"))
				grade = rs.getString(9);
		}				
	}catch (Exception e1) {					
	e1.printStackTrace();
	}
	// 将学生信息和成绩放入表格
	jtable_2.setValueAt(stu_name, 0, 0);
	jtable_2.setValueAt(sno, 0, 1);
	jtable_2.setValueAt(subject, 0, 2);
	jtable_2.setValueAt(grade, 0, 3);					
}else if(e.getActionCommand() == "修改成绩"){
	ChangeGrade cg = new ChangeGrade(sno, subject);   // 弹出修改成绩的界面
}else if(e.getActionCommand() == "退出系统"){
	System.exit(0);
}
}

当某个教师想要查看某个学生的这门课程考了多少分的时候,只需要在文本框中输入学生的学号,然后单击查询成绩按钮,然后就会将文本框中的学号获取与数据库中的Student表进行匹配,由于教师只能查看这个学生他所教的课程的分数,所以首先要判断这个教师所教的课程,然后查询相应的分数,并将信息加入到下方的表格就完成了学生成绩的查询;
当某教师发现某个学生的成绩有误时,则可以点击修改成绩按钮,此时就会弹出一个修改成绩的界面cg,对于这个窗口的实现下面将会讲到;
(5) 修改密码界面实现
根据前面的设计,将相应的组件加入到窗口,创建出修改密码界面如下图所示:
在这里插入图片描述
从界面中可以看到有3个文本框和3个单击按钮,当我们在第一个文本框输入原密码,在后面两个文本框输入新的密码,点击确认修改,如果原密码输入正确且新密码和确认密码相同则就会修改成功,否则就会修改失败并弹出提示框提示用户重新输入,主要的实现代码如下:

// 动作监听函数
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand() == "确认修改"){
			try {
				ps = ct.prepareStatement("select * from Student where 学号=? ");
				ps.setString(1, Sno);						
				rs=ps.executeQuery();
				//取出对应学号学生信息
				while(rs.next()){				
					old_password = rs.getString(3); //将学生的旧密码取出
				}
			} catch (SQLException e1) {			
				e1.printStackTrace();
			}
			change_password();
		}else if(e.getActionCommand() == "退出修改"){
			dispose();
		}else if(e.getActionCommand() == "重置"){
			clear();
		}
	}

此响应函数首先从数据库中将此学生的旧密码取出,用于判断输入的原密码是否正确;然后执行change_password()函数来修改密码,函数的主体如下:

public void change_password(){
		// 获得新密码和确认密码
		String new_password_1 = String.valueOf(jpf_1.getPassword());
		String new_password_2 = String.valueOf(jpf_2.getPassword());
		
		if(old_password.equals(jtf.getText()) && new_password_1.equals(new_password_2) && !new_password_1.isEmpty() && !new_password_2.isEmpty()){
			try{
				String sql="update Student set 密码=? where 学号=? "; 
				ps = ct.prepareStatement(sql);					
				ps.setString(1, new_password_1);
				ps.setString(2, Sno);
				int count=ps.executeUpdate();//执行sql语句			
				ct.close();
			}catch (SQLException e1) {				
				e1.printStackTrace();
			}
			JOptionPane.showMessageDialog(null, "修改成功", "提示信息", JOptionPane.WARNING_MESSAGE);
			dispose();
		}else if(jtf.getText().isEmpty())
		{
			JOptionPane.showMessageDialog(null, "请输入原密码!", "提示信息", JOptionPane.WARNING_MESSAGE);
		}else if(!old_password.equals(jtf.getText()))
		{
			JOptionPane.showMessageDialog(null, "原密码错误\n请重新输入!", "提示信息", JOptionPane.ERROR_MESSAGE);
			clear();
		}else if(new_password_1.isEmpty() || new_password_2.isEmpty())
		{
			JOptionPane.showMessageDialog(null, "新密码或者确认密码为空\n请重新输入!", "提示信息", JOptionPane.WARNING_MESSAGE);
		}else if(!new_password_1.equals(new_password_2))
		{
			JOptionPane.showMessageDialog(null, "确认密码与新密码不符\n请重新输入!", "提示信息", JOptionPane.ERROR_MESSAGE);
		}
	}

实现的过程为:首先判断用户是否输入了原密码或输入的原密码是否正确,然后判断输入的新密码和确认密码是否相同,当满足这些条件,点击确认修改即可成功修改密码;如果不满足以上需求,则会弹出相应的提示框提示用户重新输入;
当点击退出修改按钮,则当前的修改密码界面将会关闭,而学生界面不会关闭,程序可以继续执行。
(6) 修改成绩界面实现
根据修改成绩界面的设计,将相应的组件插入到窗口中,得到的界面如下:
在这里插入图片描述

在文本框中输入修改后的分数,然后点击确认修改,如果符合要求,则对应学号的学生成绩将会被修改,具体的代码实现如下:

// 动作监听函数
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand() == "确认修改"){
			change_grade();
		}else if(e.getActionCommand() == "重置"){
			clear();
		}else if(e.getActionCommand() == "退出修改"){
			dispose();
		}
	}

当在文本框输入成绩之后,点击确认修改,则会执行change_grade()函数,判断输入的分数是否满足要求(大于等于0小于等于100),如果满足则修改成功;当点击退出修改则当前界面将会关闭;下面详细讲解change_grade()函数:

public void change_grade(){
		String new_grade = String.valueOf(jtf.getText());
		// 当输入成绩,将字符串转换为数字
		double num_grade = 0;
		if(!new_grade.isEmpty())
			num_grade = Double.valueOf(new_grade);
		
		if(new_grade.isEmpty()){
			JOptionPane.showMessageDialog(null, "修改成绩为空\n请重新输入!", "提示信息", JOptionPane.WARNING_MESSAGE);
		}else if(num_grade > 100 || num_grade < 0){
			JOptionPane.showMessageDialog(null, "分数必须在0~100之间\n请重新输入!", "提示信息", JOptionPane.WARNING_MESSAGE);
		}else {
			try{
				String sql;
				if(subject.equals("高数")) {
					sql = "update Student set 高数=? where 学号=?";
					ps = ct.prepareStatement(sql);
				}else if(subject.equals("C语言")) {
					sql = "update Student set C语言 = ? where 学号=?";
					ps = ct.prepareStatement(sql);
				}else if(subject.equals("Java")) {
					sql = "update Student set java=? where 学号=?";
					ps = ct.prepareStatement(sql);
				} else if(subject.equals("英语")){
					sql = "update Student set 英语=? where 学号=?";
					ps = ct.prepareStatement(sql);
				}
				ps.setString(1, new_grade);
				ps.setString(2, Sno);
				int count=ps.executeUpdate();//执行sql语句		
				ct.close();
			}
			catch (SQLException e1) {
				e1.printStackTrace();
			}	
			JOptionPane.showMessageDialog(null, "修改成功", "提示信息", JOptionPane.WARNING_MESSAGE);
			dispose(); // 修改成功后关闭此界面
		}
	}

首先获取输入文本框的内容,由于下面要进行判断是否小于0或者大于100,所以先将其转换为double类型的数据,当满足条件,则对相应的课程成绩进行修改,如果不满足要求就会弹出提示对话框提示用户重新输入。

实现结果

(1) 学生身份登录
a) 假如我是数据库里面学生表(Student)的王一同学,现在我用我的用户名(stu1)和密码(s1)来登录学生界面:
在这里插入图片描述

如图显示我已经登录成功,紧接着我点击确定按钮,就会进入的学生界面如下图:
在这里插入图片描述

b) 从界面可以看到我的姓名和学号,然后我想查询我的考场信息和考试成绩,我接着点击考场查询和成绩查询,查询结果如下:
在这里插入图片描述

c) 从界面我可以看到我的考场信息和成绩信息,然后我又想修改我的登录密码,然后我点击修改密码按钮,输入我的原密码(s1)和新密码(sss1),然后点击然后确认修改即可;
在这里插入图片描述
此时我们可以看到数据库中王一同学的密码变为了sss1:
在这里插入图片描述

如果我的原密码输入错误或者新密码和确认密码不匹配或为空,则会出现以下提示:
在这里插入图片描述

(2) 教师身份登录
a) 假如我是数据库教师表(Teacher)里的张明老师,现在我用我的用户名(tea1)和密码(t1)来登录教师界面:

在这里插入图片描述
如图显示我已经登录成功,紧接着我点击确定按钮,就会进入的教师界面如下图:
在这里插入图片描述

b) 从界面中我可以看到我的姓名和教工号,接下来我想查询个人信息和查询学号为20181001的学生的高数成绩,然后我点击个人信息按钮,输入学号点击查询成绩按钮,结果如图:
在这里插入图片描述

c) 从界面我可以看到我的个人信息和王一同学的高数成绩,我发现分数写错了,我现在想要将他的成绩修改成85分,于是我点击修改成绩按钮,输入85,点击确认修改之后即可:
在这里插入图片描述

此时我们可以看到王一的高数成绩变为了85分:
在这里插入图片描述

如果我输入的数字大于100或者小于0都会弹出提示框,如图所示:
在这里插入图片描述
对于其他学生或者教师的登录与操作都是相同的,在此就不一一做演示,通过以上的结果我们可以看出这个简单的管理系统基本功能是可以实现的!

完整代码

1、登录界面 Login.java

package student_system;

/*
 * 某大学学生管理系统
 * 
 * 1、登录界面
 * 
 * 2、可以选择不同的身份登录(学生或教师)
 * 
 * 3、用正确的用户名和密码来实现登录
 * 
 * 作者:小木同学
 */

import javax.swing.*;                             // 引入swing工具包进行GUI的设计

import java.awt.*;					             // 引入awt工具包
//import java.awt.event.ActionEvent;              // 动作事件
//import java.awt.event.ActionListener;           // 动作监听器
import java.awt.event.*;

import java.sql.*;                              // 数据库包

public class Login extends JFrame implements ActionListener{
	
	// 定义组件	
	JPanel jp_1, jp_2, jp_3, jp_4 = null;       // 设置4个面板	
	JLabel jlb_1, jlb_2, jlb_3 = null;          // 设置3个标签(用户、密码、身份)
	JTextField jtf = null;	                    // 设置1个普通文本框,用来输入用户账号	
	JPasswordField jpf = null;                  // 设置一个密码文本框,用来输入密码
	JRadioButton jrb_1, jrb_2 = null;           // 设置两个按钮,用来选择身份(学生或者老师)
	ButtonGroup bg = null;				        // 添加一个按钮组(只能选择其中的一个)
	JButton jb_1, jb_2, jb_3 = null;            // 设置三个单击按钮(登录、重置、退出)
	 
		
	// 设定用户名和密码
	String user_name;
	String password;
	
	// 学生姓名和学号
	String stu_name;
	String sno;
	
	// 老师姓名和教工号
	String tea_name;
	String tno;
	

	// 数据库驱动
	static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	static String dbURL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=jsp";
	
	// 数据库用户名和密码
	static String userName="sa";
	static String userPwd="myh";
	
	// 数据库连接、sql语句、结果集等对象
	static Connection ct = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	
		
	public static void main(String[] args){
		// 创建登录界面
		Login login = new Login();	
		
		// 进行数据库的连接
		try {
			Class.forName(driverName);
			ct=DriverManager.getConnection(dbURL, userName, userPwd);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	// 构造函数
	public Login()
	{
		// 创建组件
		
		// 面板(JPanel)
		jp_1 = new JPanel();
		jp_2 = new JPanel();
		jp_3 = new JPanel();
		jp_4 = new JPanel();
		
		// 标签(JLabel)
		jlb_1 = new JLabel("用户名");
		jlb_2 = new JLabel("密   码");
		jlb_3 = new JLabel("身   份");
		
		// 普通文本框(JTextField)		
		jtf = new JTextField(10);              // 用于输入用户名
		
		// 密码文本框(JPasswordField)		
		jpf = new JPasswordField(10);          // 用于输入登录密码
		
		// 单选按钮(JRadioButton)
		jrb_1 = new JRadioButton("教师");      // 用于选择身份
		jrb_2 = new JRadioButton("学生");	
		
		//按钮组(ButtonGroup)只能选择其中一个
		bg = new ButtonGroup();
		bg.add(jrb_1);
		bg.add(jrb_2);
		jrb_2.setSelected(true);               // 默认为学生
		
		//单击按钮(JButton)
		jb_1 = new JButton("登录");
		jb_2 = new JButton("重置");
		jb_3 = new JButton("退出");	
		// 设置监听
		jb_1.addActionListener(this);
		jb_2.addActionListener(this);
		jb_3.addActionListener(this);
		
		
		// 将个组件加入到面板
		jp_1.add(jlb_1);
		jp_1.add(jtf);
		
		jp_2.add(jlb_2);
		jp_2.add(jpf);
		
		jp_3.add(jlb_3);
		jp_3.add(jrb_1);
		jp_3.add(jrb_2);
		
		jp_4.add(jb_1);
		jp_4.add(jb_2);
		jp_4.add(jb_3);
		
		// 将面板加入到框架
		this.add(jp_1);
		this.add(jp_2);
		this.add(jp_3);
		this.add(jp_4);
		
				
		// 设置布局管理器(格网布局)
		this.setLayout(new GridLayout(4,1));
		
		// 给窗口添加标题
		this.setTitle("某大学学生管理系统");
		
		// 设置窗口大小
		this.setSize(500, 300);
		
		// 设置窗口的起始位置
		this.setLocationRelativeTo(null);       //在屏幕中间显示(居中显示)
		
		// 设置当关闭窗口时,程序也结束
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// 显示窗口
		this.setVisible(true);
		this.setResizable(true);		
	}
	
	
	// 将两个文本框的内容清空,点击重置按钮时调用
	public void clear(){
		jtf.setText("");
		jpf.setText("");
	}
		
	// 动作事件监听函数
	public void actionPerformed(ActionEvent e){	
		if(e.getActionCommand() == "登录"){
			// 选中教师登录
			if(jrb_1.isSelected()){
				try {
					ps = ct.prepareStatement("select * from Teacher where 身份=? and 用户名=?");
					// 给?赋值(按照身份为教师、用户名为输入的用户名查询)
					ps.setString(1, "教师");					
					ps.setString(2, jtf.getText());

					// ResultSet结果集
					rs = ps.executeQuery();
					if(rs.next()){					
						//将教师的用户名、密码、姓名、教工号从数据库取出
						user_name = rs.getString(2);
						password = rs.getString(3);						 
						tea_name = rs.getString(5);						 
						tno = rs.getString(4);
						tea_login();
					}else {
						JOptionPane.showMessageDialog(null, "没有此用户或用户名为空!\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
					}
				}catch (SQLException e1) {
					e1.printStackTrace();
				}							
			}else if(jrb_2.isSelected()) {  // 学生登录
				try {
					ps = ct.prepareStatement("select * from Student where 身份=? and 用户名=?");
					//给?赋值(按照身份为学生、用户名为输入的用户名查询)
					ps.setString(1, "学生");
					ps.setString(2, jtf.getText());

					//ResultSet结果集
					rs=ps.executeQuery();
					if(rs.next()){
						//将学生的用户名、密码、姓名、学号取出
						user_name = rs.getString(2);
						password = rs.getString(3);					 
						stu_name = rs.getString(5);
						sno = rs.getString(4);						 
						stu_login();
					}else {
						JOptionPane.showMessageDialog(null, "没有此用户或用户名为空!\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
					}
				} catch (SQLException e1) {					
					e1.printStackTrace();
				}												
			}
		}else if(e.getActionCommand() == "重置"){	
			clear();	        // 清除文本框里的内容	
		}else if(e.getActionCommand() == "退出"){		
			System.exit(0);		// 结束程序,关闭所有窗口
		}	
	}
	
	
	// 学生登陆判断方法
	public void stu_login(){
		if(user_name.equals(jtf.getText()) && password.equals(String.valueOf(jpf.getPassword()))){
			JOptionPane.showMessageDialog(null, "登陆成功!", "提示消息", JOptionPane.WARNING_MESSAGE);		
			clear();		
			dispose();			// 关闭当前登录界面
			Student stu = new Student(stu_name, sno); // 创建学生界面并显示
		}else if(jtf.getText().isEmpty() && String.valueOf(jpf.getPassword()).isEmpty()){	
			JOptionPane.showMessageDialog(null, "请输入用户名和密码!", "提示消息", JOptionPane.WARNING_MESSAGE);	
		}else if(jtf.getText().isEmpty()){		
			JOptionPane.showMessageDialog(null, "请输入用户名!", "提示信息", JOptionPane.WARNING_MESSAGE);	
		}else if(String.valueOf(jpf.getPassword()).isEmpty()){		
			JOptionPane.showMessageDialog(null, "请输入密码!", "提示信息", JOptionPane.WARNING_MESSAGE);		
		}else{			
			JOptionPane.showMessageDialog(null, "用户名或者密码错误!\n请重新输入", "提示信息", JOptionPane.ERROR_MESSAGE);
			clear();			
		}
	}
	
	
	// 教师登陆判断方法
	public void tea_login() {
		if(user_name.equals(jtf.getText()) && password.equals(String.valueOf(jpf.getPassword()))) {		
			JOptionPane.showMessageDialog(null, "登录成功", "提示信息", JOptionPane.WARNING_MESSAGE);		
			clear();		
			dispose();		
			Teacher tea = new Teacher(tea_name, tno);			
		}else if(jtf.getText().isEmpty() && String.valueOf(jpf.getPassword()).isEmpty()) {		
			JOptionPane.showMessageDialog(null, "请输入用户名和密码!", "提示信息", JOptionPane.WARNING_MESSAGE);		
		}else if(jtf.getText().isEmpty()) {	
			JOptionPane.showMessageDialog(null, "请输入用户名!", "提示信息", JOptionPane.WARNING_MESSAGE);	
		}else if(String.valueOf(jpf.getPassword()).isEmpty()) {		
			JOptionPane.showMessageDialog(null, "请输入密码!", "提示信息", JOptionPane.WARNING_MESSAGE);	
		}else {	
			JOptionPane.showMessageDialog(null, "用户名或密码错误!\n请重新输入", "提示信息", JOptionPane.ERROR_MESSAGE);	
			clear();
		}		
	}
}

2、学生界面 Student.java

package student_system;

/*
 * 学生界面
 * 
 * 功能1:显示姓名和学号
 * 
 * 功能2:查询考场信息
 * 
 * 功能3:查询考试成绩
 * 
 * 功能4:修改登录密码
 * 
 * 作者:小木同学
 */


import javax.swing.*;
import javax.swing.table.DefaultTableModel;

import java.awt.*;
import java.awt.event.*;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


public class Student extends JFrame implements ActionListener{
	
	// 定义组件	
	JPanel jp_1, jp_2, jp_3, jp_4, jp_5, jp_6 = null;                        // 姓名、学号	
	JLabel jlb_1, jlb_2, jlb_3, jlb_4 = null;                     // 姓名、学号	
	JButton jb_1, jb_2, jb_3, jb_4 = null;                           // 单击按钮(查成绩和选课)
	JTable jtable_1, jtable_2 = null;                                      // 表格
	DefaultTableModel model_1, model_2 = null;                            
	JScrollPane jsp_1, jsp_2 = null;                                    // 滚动条
	
	
	// 存储学生的学号和各科的成绩
	String Sno; // 学号
	String math; // 数学分数
	String c; // C语言分数
	String java; // java分数
	String english; // 英语分数
	
	String math_room; // 数学考场
	String c_room; // C语言考场
	String java_room; // java考场
	String english_room; //英语考场

	
	// 数据库驱动
	static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	static String dbURL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=jsp";
	
	// 数据库用户名和密码
	static String userName = "sa";
	static String userPwd = "myh";
	
	// 设置与数据库连接的对象、sql语句、查询的结果集
	static Connection ct = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	
		
	// 主函数,单独运行时有作用(用于测试)	
	public static void main(String[] args)
	{		
		Student stu = new Student("小木同学","123456789");
	}
	
	
	
	// 构造函数(参数为登录学生的姓名和学号)	
	Student(String name,String sno){		
		Sno = sno;                     // 得到登录学生学号(用于后面查询成绩)
		
		// 连接数据库(加载驱动、建立连接)
		try {
			Class.forName(driverName);
			ct = DriverManager.getConnection(dbURL, userName, userPwd);
		} catch (Exception e) {
			e.printStackTrace();
		}
			
		// 创建组件		
		// 面板
		jp_1 = new JPanel();
		jp_2 = new JPanel();
		jp_3 = new JPanel();
		jp_4 = new JPanel();
		jp_5 = new JPanel();
		jp_6 = new JPanel();
		
		// 标签		
		jlb_1 = new JLabel("姓名:");
		jlb_2 = new JLabel(name);
		jlb_3 = new JLabel("学号:");
		jlb_4 = new JLabel(sno);

		jlb_1.setFont(new java.awt.Font("Dialog", 1, 30));
		jlb_2.setFont(new java.awt.Font("Dialog", 1, 25));
		jlb_3.setFont(new java.awt.Font("Dialog", 1, 30));
		jlb_4.setFont(new java.awt.Font("Dialog", 1, 25));
		
		// 单击按钮		
		jb_1 = new JButton("考场查询");
		jb_2 = new JButton("成绩查询");
		jb_3 = new JButton("退出系统");
		jb_4 = new JButton("修改密码");
		jb_1.setFont(new java.awt.Font("Dialog", 1, 20));
		jb_2.setFont(new java.awt.Font("Dialog", 1, 20));
		jb_3.setFont(new java.awt.Font("Dialog", 1, 20));
		jb_4.setFont(new java.awt.Font("Dialog", 1, 20));
		
		// 设置动作监听		
		jb_1.addActionListener(this);
		jb_2.addActionListener(this);
		jb_3.addActionListener(this);
		jb_4.addActionListener(this);
		
		// 设置表格
		String[] colnames = {"高数成绩", "C语言成绩", "Java成绩", "英语成绩" };		
		model_2 = new DefaultTableModel(colnames,1);		
		jtable_2 = new JTable(model_2);		
		jsp_2 = new JScrollPane(jtable_2);
		
		String[] colnames_1 = {"高数考场", "C语言考场", "Java考场", "英语考场"};
		model_1 = new DefaultTableModel(colnames_1, 1);
		jtable_1 = new JTable(model_1);
		jsp_1 = new JScrollPane(jtable_1);	
		
		// 加入面板		
		jp_1.add(jlb_1);
		jp_1.add(jlb_2);
		
		jp_2.add(jlb_3);
		jp_2.add(jlb_4);
		
		jp_3.add(jb_1);
		jp_3.add(jsp_1);
		
		jp_4.add(jb_2);
		jp_4.add(jsp_2);
		
		jp_5.add(jb_4);
		jp_5.add(jb_3);
		
		// 将面板加入到窗口		
		this.add(jp_1);
		this.add(jp_2);
		this.add(jp_3);
		this.add(jp_4);
		this.add(jp_5);
		
		// 设置布局管理器(网格布局和流式布局)
		this.setLayout(new GridLayout(5, 1));
		jp_1.setLayout(new FlowLayout(FlowLayout.LEFT));
		jp_2.setLayout(new FlowLayout(FlowLayout.LEFT));
		
		// 设置窗口标题
		this.setTitle("某大学学生页面");
		
		// 设置窗口大小
		this.setSize(500, 500);
				
		// 设置窗口的起始位置
		this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
		
		// 设置当关闭窗口时,程序也结束
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// 显示窗口
		this.setVisible(true);
		this.setResizable(true);		
	}
	
	
	// 动作事件监听函数
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand() == "考场查询"){
			try{		
				ps = ct.prepareStatement("select * from Student where 学号 =? ");	// 将编译好的SQL语句赋值给ps		
				ps.setString(1, Sno);			// 给?赋值,用setString将设置SQL语句按照学号Sno查询			
				rs = ps.executeQuery();	        // ResultSet结果集,将对应学号的每一行信息放在ResultSet中
				
				// 获取对应学号的学生考场信息
				while(rs.next()){
					math_room = rs.getString(10);				
					c_room = rs.getString(11);				
					java_room = rs.getString(12);				
					english_room = rs.getString(13);	
				}				
			}catch (Exception e1) {					
			e1.printStackTrace();
			}
			// 将考场信息加入表格
			jtable_1.setValueAt(math_room, 0, 0);
			jtable_1.setValueAt(c_room, 0, 1);
			jtable_1.setValueAt(java_room, 0, 2);
			jtable_1.setValueAt(english_room, 0, 3);	
		}else if(e.getActionCommand() == "成绩查询"){			
			try{
				ps = ct.prepareStatement("select * from Student where 学号 =? ");		
				ps.setString(1, Sno);								
				rs = ps.executeQuery();						
				// 获取对应学号的学生成绩
				while(rs.next()){						
					math = rs.getString(6);				
					c = rs.getString(7);				
					java = rs.getString(8);				
					english = rs.getString(9);	
				}				
			}catch (Exception e1) {					
			e1.printStackTrace();
			}
			// 将考试成绩加入表格	
			jtable_2.setValueAt(math, 0, 0);
			jtable_2.setValueAt(c, 0, 1);
			jtable_2.setValueAt(java, 0, 2);
			jtable_2.setValueAt(english, 0, 3);		
		}else if(e.getActionCommand() == "修改密码"){
			ChangePassword cp = new ChangePassword(Sno);  // 学号为Sno的学生修改密码,弹出修改密码界面
		}else if(e.getActionCommand() == "退出系统"){
			System.exit(0);        // 结束程序,所有窗口关闭
		}	
	}
}

3、教师界面 Teacher.java

package student_system;

/*
 * 教师界面
 * 
 * 功能1:显示姓名和教工号
 * 
 * 功能2:查询个人信息
 * 
 * 功能3:按照学号查询学生成绩
 * 
 * 功能4:修改对应学号学生成绩
 * 
 * 作者:小木同学
 */


import javax.swing.*;
import javax.swing.table.DefaultTableModel;

import java.awt.*;
import java.awt.event.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Teacher extends JFrame implements ActionListener{
	
	// 定义组件
	JPanel jp_1, jp_2, jp_3, jp_4, jp_5 = null;
	JLabel jlb_1, jlb_2, jlb_3, jlb_4, jlb_5 = null;
	JButton jb_1, jb_2, jb_3, jb_4 = null;
	JTextField jtf;
	JTable jtable_1, jtable_2 = null;                                     
	DefaultTableModel model_1, model_2 = null;                            
	JScrollPane jsp_1, jsp_2 = null;                                  
	
	String tea_no; // 存储教师教工号
	String tea_name; // 教师姓名
	String sexual;  // 教师性别
	String age; // 年龄
	String salary; // 工资
	String position; // 职称
	String subject; // 科目
	
	String sno; // 学生学号
	String stu_name; //学生姓名
	String grade; // 分数
	
	// 数据库驱动
	static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	static String dbURL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=jsp";
		
	// 数据库用户名和密码
	static String userName = "sa";
	static String userPwd = "myh";
		
	// 设置与数据库连接的对象、sql语句、查询的结果集
	static Connection ct = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	
	public static void main(String args[]){
		Teacher tea = new Teacher("小木同学", "123456789");
	}
	
	public Teacher(String name, String tno){			
		tea_no = tno;  // 记录教工号	
		
		// 连接数据库(加载驱动、建立连接)
		try {
			Class.forName(driverName);
			ct = DriverManager.getConnection(dbURL, userName, userPwd);
		} catch (Exception e) {
			e.printStackTrace();
		}
				
		// 面板
		jp_1 = new JPanel();
		jp_2 = new JPanel();
		jp_3 = new JPanel();
		jp_4 = new JPanel();
		jp_5 = new JPanel();
		
		// 标签
		jlb_1 = new JLabel("姓名:");
		jlb_2 = new JLabel(name);
		jlb_3 = new JLabel("教工号:");
		jlb_4 = new JLabel(tno);
		jlb_5 = new JLabel("请输入学号");
		
		jlb_1.setFont(new java.awt.Font("Dialog", 1, 30));
		jlb_2.setFont(new java.awt.Font("Dialog", 1, 25));
		jlb_3.setFont(new java.awt.Font("Dialog", 1, 30));
		jlb_4.setFont(new java.awt.Font("Dialog", 1, 25));
		jlb_5.setFont(new java.awt.Font("Dialog", 1, 20));
		
		// 单击按钮
		jb_1 = new JButton("个人信息");
		jb_2 = new JButton("查询成绩");
		jb_3 = new JButton("修改成绩");
		jb_4 = new JButton("退出系统");
		jb_1.setFont(new java.awt.Font("Dialog", 1, 20));
		jb_2.setFont(new java.awt.Font("Dialog", 1, 15));
		jb_3.setFont(new java.awt.Font("Dialog", 1, 20));
		jb_4.setFont(new java.awt.Font("Dialog", 1, 20));
		
		// 添加监听器
		jb_1.addActionListener(this);
		jb_2.addActionListener(this);
		jb_3.addActionListener(this);
		jb_4.addActionListener(this);
		
		// 文本框
		jtf = new JTextField(10);
		
		// 设置表格
		String[] colnames_1 = {"姓名", "性别", "年龄","工资", "职称", "所教科目"};
		model_1 = new DefaultTableModel(colnames_1, 1);
		jtable_1 = new JTable(model_1);
		jsp_1 = new JScrollPane(jtable_1);
		
		String[] colnames_2 = {"姓名", "学号", "科目", "成绩"};
		model_2 = new DefaultTableModel(colnames_2, 1);
		jtable_2 = new JTable(model_2);
		jsp_2 = new JScrollPane(jtable_2);
		
		// 加入面板
		jp_1.add(jlb_1);
		jp_1.add(jlb_2);
		
		jp_2.add(jlb_3);
		jp_2.add(jlb_4);
		
		jp_3.add(jb_1);
		jp_3.add(jsp_1);
		
		jp_4.add(jlb_5);
		jp_4.add(jtf);
		jp_4.add(jb_2);
		jp_4.add(jsp_2);
		
		jp_5.add(jb_3);
		jp_5.add(jb_4);
		
		// 将面板加入窗口
		this.add(jp_1);
		this.add(jp_2);
		this.add(jp_3);
		this.add(jp_4);
		this.add(jp_5);
		
		// 设置布局管理器(网格布局和流式布局)
		this.setLayout(new GridLayout(5, 1));
		jp_1.setLayout(new FlowLayout(FlowLayout.LEFT));
		jp_2.setLayout(new FlowLayout(FlowLayout.LEFT));
		
		// 设置窗口标题
		this.setTitle("某大学教师页面");
				
		// 设置窗口大小
		this.setSize(500, 500);
							
		// 设置窗口的起始位置
		this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
				
		// 设置当关闭窗口时,程序也结束
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				
		// 显示窗口
		this.setVisible(true);
		this.setResizable(true);					
	}
	
	// 动作响应函数
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand() == "个人信息"){		
			try{
				ps = ct.prepareStatement("select * from Teacher where 教工号 =? ");			
				ps.setString(1, tea_no);
				
				rs = ps.executeQuery();					
				// 获取对应教工号的教师信息
				while(rs.next()){						
					tea_name = rs.getString(5);				
					sexual = rs.getString(6);				
					age = rs.getString(9);				
					salary = rs.getString(7);
					position = rs.getString(8);
					subject = rs.getString(10);
				}				
			}catch (Exception e1) {					
			e1.printStackTrace();
			}
			// 将获取到的个人信息放入表格
			jtable_1.setValueAt(tea_name, 0, 0);
			jtable_1.setValueAt(sexual, 0, 1);
			jtable_1.setValueAt(age, 0, 2);
			jtable_1.setValueAt(salary, 0, 3);	
			jtable_1.setValueAt(position, 0, 4);
			jtable_1.setValueAt(subject, 0, 5);
		}else if(e.getActionCommand() == "查询成绩"){   // 想查询哪个学生的成绩(输入其学号)			
			sno = jtf.getText();
			try{
				ps = ct.prepareStatement("select * from Student where 学号 =? ");		
				ps.setString(1, sno);			
				
				rs = ps.executeQuery();					
				// 获取对应学号的学生成绩(根据此教师所教的科目)
				while(rs.next()){						
					stu_name = rs.getString(5);
					if(subject.equals("高数"))
						grade = rs.getString(6);
					else if(subject.equals("C语言"))
						grade = rs.getString(7);
					else if(subject.equals("Java"))
						grade = rs.getString(8);
					else if(subject.equals("英语"))
						grade = rs.getString(9);
				}				
			}catch (Exception e1) {					
			e1.printStackTrace();
			}
			// 将学生信息和成绩放入表格
			jtable_2.setValueAt(stu_name, 0, 0);
			jtable_2.setValueAt(sno, 0, 1);
			jtable_2.setValueAt(subject, 0, 2);
			jtable_2.setValueAt(grade, 0, 3);					
		}else if(e.getActionCommand() == "修改成绩"){
			ChangeGrade cg = new ChangeGrade(sno, subject);   // 弹出修改成绩的界面
		}else if(e.getActionCommand() == "退出系统"){
			System.exit(0);
		}
	}
}

4、修改密码界面 ChangePassword.java

package student_system;

/*
 * 功能:修改密码
 * 
 * 作者:小木同学
 */

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

import java.sql.*;

public class ChangePassword extends JFrame implements ActionListener{
	
	// 定义组件
	JPanel jp_1, jp_2, jp_3, jp_4 = null;
	JLabel jlb_1, jlb_2, jlb_3 = null;
	JTextField jtf = null;  // 用来输入原密码
	JPasswordField jpf_1, jpf_2 = null; // 用来输入新密码和确认密码
	JButton jb_1, jb_2, jb_3 = null; 
	
	String Sno; // 存储学生的学号
	String old_password; // 存储旧密码
	
	// 数据库驱动
	static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	static String dbURL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=jsp";
		
	// 数据库用户名和密码
	static String userName = "sa";
	static String userPwd = "myh";
		
	// 设置与数据库连接的对象、sql语句、查询的结果集
	static Connection ct = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
		
	// 主函数(实际运行时不需要)
	public static void main(String[] args[]){
		ChangePassword cp = new ChangePassword("muyongheng");
	}
	
	// 清除文本框内容
	public void clear(){
		jtf.setText("");
		jpf_1.setText("");
		jpf_2.setText("");
	}
	
	public ChangePassword(String sno){		
		Sno = sno;          // 赋值学号
		
		// 连接数据库(加载驱动、建立连接)
		try {
			Class.forName(driverName);
			ct = DriverManager.getConnection(dbURL, userName, userPwd);
		} catch (Exception e) {
			e.printStackTrace();
		}
				
		jp_1 = new JPanel();
		jp_2 = new JPanel();
		jp_3 = new JPanel();
		jp_4 = new JPanel();
		
		jlb_1 = new JLabel("原密码");
		jlb_2 = new JLabel("新密码");
		jlb_3 = new JLabel("确认密码");
		
		jtf = new JTextField(10);
		jpf_1 = new JPasswordField(10); 
		jpf_2 = new JPasswordField(10);
		
		jb_1 = new JButton("确认修改");
		jb_2 = new JButton("退出修改");
		jb_3 = new JButton("重置");
		
		// 添加监听
		jb_1.addActionListener(this);
		jb_2.addActionListener(this);
		jb_3.addActionListener(this);
		
		jp_1.add(jlb_1);
		jp_1.add(jtf);
		
		jp_2.add(jlb_2);
		jp_2.add(jpf_1);
		
		jp_3.add(jlb_3);
		jp_3.add(jpf_2);
		
		jp_4.add(jb_1);
		jp_4.add(jb_2);
		jp_4.add(jb_3);
		
		
		this.add(jp_1);
		this.add(jp_2);
		this.add(jp_3);
		this.add(jp_4);
		
		// 设置布局管理器(格网布局)
		this.setLayout(new GridLayout(4,1));
		// 给窗口添加标题
		this.setTitle("修改密码");
				
		// 设置窗口大小
		this.setSize(500, 300);
				
		// 设置窗口的起始位置
		//this.setLocation(null);
		this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
				
		// 设置当关闭窗口时,程序也结束
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				
		// 显示窗口
		this.setVisible(true);
		this.setResizable(true);		
	}
	
	// 动作监听函数
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand() == "确认修改"){
			try {
				ps = ct.prepareStatement("select * from Student where 学号=? ");
				ps.setString(1, Sno);		
				
				rs=ps.executeQuery();
				//取出对应学号学生信息
				while(rs.next()){				
					old_password = rs.getString(3);      //将学生的旧密码取出,用于判断原密码是否正确
				}
			} catch (SQLException e1) {			
				e1.printStackTrace();
			}
			change_password();
		}else if(e.getActionCommand() == "退出修改"){
			dispose();
		}else if(e.getActionCommand() == "重置"){
			clear();
		}
	}
	
	
	
	public void change_password(){
		// 获得新密码和确认密码
		String new_password_1 = String.valueOf(jpf_1.getPassword());
		String new_password_2 = String.valueOf(jpf_2.getPassword());
		
		if(old_password.equals(jtf.getText()) && new_password_1.equals(new_password_2) && !new_password_1.isEmpty() && !new_password_2.isEmpty()){
			try{
				String sql="update Student set 密码=? where 学号=? ";//生成一条mysql语句
				ps = ct.prepareStatement(sql);					
				ps.setString(1, new_password_1);
				ps.setString(2, Sno);
				int count=ps.executeUpdate();//执行sql语句			
				ct.close();
			}catch (SQLException e1) {				
				e1.printStackTrace();
			}
			JOptionPane.showMessageDialog(null, "修改成功", "提示信息", JOptionPane.WARNING_MESSAGE);
			dispose();
		}else if(jtf.getText().isEmpty())
		{
			JOptionPane.showMessageDialog(null, "请输入原密码!", "提示信息", JOptionPane.WARNING_MESSAGE);
		}else if(!old_password.equals(jtf.getText()))
		{
			JOptionPane.showMessageDialog(null, "原密码错误\n请重新输入!", "提示信息", JOptionPane.ERROR_MESSAGE);
			clear();
		}else if(new_password_1.isEmpty() || new_password_2.isEmpty())
		{
			JOptionPane.showMessageDialog(null, "新密码或者确认密码为空\n请重新输入!", "提示信息", JOptionPane.WARNING_MESSAGE);
		}else if(!new_password_1.equals(new_password_2))
		{
			JOptionPane.showMessageDialog(null, "确认密码与新密码不符\n请重新输入!", "提示信息", JOptionPane.ERROR_MESSAGE);
		}
	}
}

5、修改成绩界面 ChangeGrade.java

package student_system;

/*
 * 功能:修改学生成绩
 * 
 * 作者:小木同学
 */
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

import java.sql.*;

public class ChangeGrade extends JFrame implements ActionListener{
	
	// 组件
	JPanel jp_1, jp_2 = null;
	JLabel jlb = null;
	JTextField jtf = null; // 输入修改的成绩
	JButton jb_1, jb_2, jb_3 = null; // 修改和退出修改按钮
	
	// 存储修改成绩学生学号和课程
	String Sno;
	String subject;
	
	// 数据库驱动
	static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	static String dbURL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=jsp";
			
	// 数据库用户名和密码
	static String userName = "sa";
	static String userPwd = "myh";
			
	// 设置与数据库连接的对象、编译后的sql语句、查询的结果集
	static Connection ct = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	
	// 主函数(实际运行时不需要)
	public static void main(String[] args[]){
		ChangeGrade cg = new ChangeGrade("123456789", "英语");
	}
	
	// 清除文本框中的内容
	public void clear(){
		jtf.setText("");
	}
	
	// 构造函数
	public ChangeGrade(String sno, String sub){
		// 学生学号以及科目
		Sno = sno;
		subject = sub;
		
		// 连接数据库(加载驱动、建立连接)
		try {
			Class.forName(driverName);
			ct = DriverManager.getConnection(dbURL, userName, userPwd);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// 面板
		jp_1 = new JPanel();
		jp_2 = new JPanel();
		
		// 标签
		jlb = new JLabel("请输入修改后成绩");
		jlb.setFont(new java.awt.Font("Dialog", 1, 20));
		
		// 文本框
		jtf = new JTextField(10);
		
		// 单击按钮
		jb_1 = new JButton("确认修改");
		jb_2 = new JButton("重置");
		jb_3 = new JButton("退出修改");
		jb_1.setFont(new java.awt.Font("Dialog", 1, 20));
		jb_2.setFont(new java.awt.Font("Dialog", 1, 20));
		jb_3.setFont(new java.awt.Font("Dialog", 1, 20));
		
		// 添加监听
		jb_1.addActionListener(this);
		jb_2.addActionListener(this);
		jb_3.addActionListener(this);
		
		// 将组件加入面板
		jp_1.add(jlb);
		jp_1.add(jtf);
		
		jp_2.add(jb_1);
		jp_2.add(jb_2);
		jp_2.add(jb_3);
		
		// 将面板加入窗口
		this.add(jp_1);
		this.add(jp_2);
		
		// 设置格网分布
		this.setLayout(new GridLayout(2,1));
		
		// 给窗口添加标题
		this.setTitle("修改学生成绩");
						
		// 设置窗口大小
		this.setSize(500, 300);
						
		// 设置窗口的起始位置
		this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
						
		// 设置当关闭窗口时,程序也结束
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
						
		// 显示窗口
		this.setVisible(true);
		this.setResizable(true);				
	}
	
	// 动作监听函数
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand() == "确认修改"){
			change_grade();
		}else if(e.getActionCommand() == "重置"){
			clear();
		}else if(e.getActionCommand() == "退出修改"){
			dispose();
		}
	}
	
	public void change_grade(){
		String new_grade = String.valueOf(jtf.getText());
		// 当输入成绩,将字符串转换为数字
		double num_grade = 0;
		if(!new_grade.isEmpty())
			num_grade = Double.valueOf(new_grade);
		
		if(new_grade.isEmpty()){
			JOptionPane.showMessageDialog(null, "修改成绩为空\n请重新输入!", "提示信息", JOptionPane.WARNING_MESSAGE);
		}else if(num_grade > 100 || num_grade < 0){
			JOptionPane.showMessageDialog(null, "分数必须在0~100之间\n请重新输入!", "提示信息", JOptionPane.WARNING_MESSAGE);
		}else {
			try{
				String sql;
				if(subject.equals("高数")) {
					sql = "update Student set 高数=? where 学号=?";
					ps = ct.prepareStatement(sql);
				}else if(subject.equals("C语言")) {
					sql = "update Student set C语言 = ? where 学号=?";
					ps = ct.prepareStatement(sql);
				}else if(subject.equals("Java")) {
					sql = "update Student set java=? where 学号=?";
					ps = ct.prepareStatement(sql);
				} else if(subject.equals("英语")){
					sql = "update Student set 英语=? where 学号=?";
					ps = ct.prepareStatement(sql);
				}
				ps.setString(1, new_grade);
				ps.setString(2, Sno);
				int count=ps.executeUpdate();//执行sql语句		
				ct.close();
			}
			catch (SQLException e1) {
				e1.printStackTrace();
			}	
			JOptionPane.showMessageDialog(null, "修改成功", "提示信息", JOptionPane.WARNING_MESSAGE);
			dispose(); // 修改成功后关闭此界面
		}
	}
}

数据库文件

自己整理一下吧(我不知道咋搞成一个表格),问题应该不大。
学生(Student)
身份 用户名 密码 学号 姓名 高数 C语言 Java 英语 高数考场 C语言考场 Java考场 英语考场
学生 stu1 sss1 20181001 王一 85 86 89 78 1场1号 2场1号 3场1号 4场1号
学生 stu2 s2 20181002 李二 83 82 75 62 1场2号 2场2号 3场2号 4场2号
学生 stu3 s3 20181003 张三 74 86 72 65 1场3号 2场3号 3场3号 4场3号
学生 stu4 s4 20181004 赵四 89 96 75 98 1场4号 2场4号 3场4号 4场4号
学生 stu5 s5 20181005 孙五 58 58 87 65 1场5号 2场5号 3场5号 4场5号
学生 stu6 s6 20181006 杨六 84 85 98 64 1场6号 2场6号 3场6号 4场6号
学生 stu7 s7 20181007 王七 74 89 86 92 1场7号 2场7号 3场7号 4场7号
学生 stu8 s8 20181008 胡八 85 71 86 91 1场8号 2场8号 3场8号 4场8号
学生 stu9 s9 20181009 冯九 91 73 61 87 1场9号 2场9号 3场9号 4场9号
学生 stu10 s10 20181010 刘十 85 69 88 65 1场10号 2场10号 3场10号 4场10号

教师(Teacher)
身份 用户名 密码 教工号 姓名 性别 工资 职称 年龄 所教科目
教师 tea1 t1 20182001 张明 男 10000 教授 56 高数
教师 tea2 t2 20182002 李红梅 女 8000 副教授 41 C语言
教师 tea3 t3 20182003 黄刚 男 9000 副教授 49 Java
教师 tea4 t4 20182004 沈丽 女 6000 讲师 35 英语

写在最后

以上就是全部内容了,我觉得代码注释也都很清楚了,动手实现的过程中如果有不懂的地方一定要查资料。。。(当然如果有错请见谅,毕竟只是一个小白)

好了,如果觉得有帮助点个赞也行,哈哈哈,至少能给我一点继续学编程的信心。加油,奥里给!

Logo

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

更多推荐