学生管理系统--课程设计项目(Java+SQL server)
作者:mmseoamin日期:2023-12-05

本科参与项目文档合集: 点击跳转~

学生管理系统

Student Management System


学校:山东科技大学

指导老师:杨 * * 教授

学号:2019032****

学生姓名:安**

专业班级:计算机19-1


                                   山东科技大学 二〇二〇年七月

项目文档目录

    • 学生管理系统
      • 1. 总体设计与要求
      • 2. 开发环境及开发工具
      • 3. 详细设计与实现
      • 4. 测试数据
      • 5. 总结
      • 6.参考文献
      • 惊喜

        1. 总体设计与要求

        项目要求

        1.1要求

         设计并编程实现一款学生个人简历管理小系统。该系统包括如下功能:

        1.1.1个人简历内容应至少包括

         学生学号、姓名、性别、出生日期、个人爱好、简历等项目。

         实现方式:用Microsoft SQL Server Management Studio 18建立本地数据库并新建一个包含学生学号、姓名、性别、出生日期、个人爱好、简历等各种信息的表格;最后与JAVA程序建立连接,并对数据库进行操作,进而实现程序功能。

        1.1.2具有学生个人信息的录入、编辑和保存功能

         实现方式:首先创建友好用户窗口管理员登录界面,添加标签面板并加入登录标签,管理员登陆成功后交互窗口到COMM Frame界面,在COMM Frame窗口中加入菜单项组件,分别为:信息总览、修改信息、添加信息、查找信息这四个部分并加入到菜单中,将菜单放入菜单条里。对四个菜单项分别用监视器监视,获取事件源后发生对应的事件响应。

        1.1.3可以通过文本框输入学生学号,查询并展示该生的个人简介

         实现方式:在点击查找信息这个菜单项后,事件源获取、事件发生;此时数据库已连接(在管理员登陆界面时连接),通过获得JTextField对象中的内容与数据库进行逐条比对,利用事件发生:若比对成功(即有对应的学号或其他特性信息)则发生事件输出显示信息,若比对失败则弹出文本框提示:无此信息。

        项目总体设计

         项目文件分为10个部分:首先有两个窗口:管理员登录窗口以及实现其他功能的总窗口;其次就是查找类、插入类、浏览类、修改类这四个项目核心类,最后这四个核心实现类又一一对应这四个函数:查找、插入、浏览(查看)、修改,共10个部分在同一个package中,故对于访问权限问题没有过于重视,大部分都为友好类或者友好方法,具体实现方式下文有具体解释,故在此不在详述。

         项目显示

        在这里插入图片描述

         具体实现结构图

        在这里插入图片描述

        2. 开发环境及开发工具

        2.1 开发环境

         Java Development Kit (JDK)

         Java Runtime Environment(JRE)

         Java version “1.8.0_251”

         Java™ SE Runtime Environment (build 1.8.0_251-b08)

         Java HotSpot™ 64-Bit Server VM (build 25.251-b08, mixed mode)

        2.2 开发工具

         Eclipse

         Microsoft SQL Server Management Studio 18

         SQL Server 2019 配置管理器

        3. 详细设计与实现

        本地数据库的构建

         在SQL Server 2019数据库上实现数据操作。使用纯面向对象的java语言作为开发语言在sql server 2019新建一个名为Student的数据库,在下面新建一个名为stu的表,然后新建一个名为login的表 存贮账号 密码:

        在这里插入图片描述

        显示其中stu图表的内容为:

        在这里插入图片描述

        在这里插入图片描述

        在这里插入图片描述

        3.1管理员登录窗口实现

        3.1.1简述

         创建一个管理员登录界面,加入标签面板加载组件,加入文本框,设置布局格式实现:一行标签一行文本输入框,包括管理员登录界面组件,创建按钮,加入事件监视器,通过与数据库建立连接,比对用户的数据库账户和密码与文本框中输入的是否相同并触发对应事件(即显示账户登录成功并打开总窗口或提示账户名或密码错误)。

        在这里插入图片描述

        3.1.2 核心代码解释

        try{
        			Connection con;
        			Statement sql;
        			ResultSet rs;
        			String url;
        	url="jdbc:sqlserver://localhost:1433;DatabaseName=Student";
        		con=DriverManager.getConnection(url,"ast",****);	//与用户名ast的数据库建立连接
        			System.out.println("数据库连接成功!!");
        			sql=con.createStatement();							//通过connection数据库链接对象 创建一个statement对象数据库操作对象
        			rs=sql.executeQuery("select * from login where name ='"+name+"' and pwd='"+pwd+"'");
        			//executeQuery()方法来下达select指令以查询数据库
        			//把数据库响应的查询结果存放在rs中供我们使用
        			int q=0;
        			while(rs.next()){
        				q++;
        			}if(q>0){
        				JOptionPane.showMessageDialog(this, "登陆成功!","消息对话框",JOptionPane.WARNING_MESSAGE);	//消息提示框1
        				this.dispose();		//释放当前子窗口
        				new CommFrame();	//创建另一个事件窗口
        			}else
        				JOptionPane.showMessageDialog(this, "账号或者密码错误!","消息对话框",JOptionPane.WARNING_MESSAGE);//消息提示框2
        		}
        		catch(SQLException exp){
        			System.out.println(exp);
        		}
        

        管理员登录窗口试运行截图

        在这里插入图片描述

        3.2项目总集合窗口实现

        3.2.1简述

         创建一个友好用户界面,包含一个菜单条,内含四个菜单项:信息总览、修改信息、添加信息、查找信息;并为每个菜单项增加事件监听,点击对应的菜单项即会触发相应的事件。并在首页面显示所有学生信息,创建一个按钮,增加监听功能,点击时触发更新数据库并显示在此页面事件。

        在这里插入图片描述

        3.2.2核心实现代码解释

        JPanel pCenter; pCenter=new JPanel();
        		pCenter.add("scanItem", scan);
        		pCenter.add("updateItem",update);
        		pCenter.add("insertItem",insert);
        		pCenter.add("searchItem",search);
        		//声明创建面板并向面板中添加各个功能的实现窗口。
        在此程序中,对四个菜单项分别用监视器监视,获取事件源后发生对应的事件响应,此窗口为综合主窗口,点击对应的菜单项后会发生事件响应,通过if(e.getSource()==scanItem)
        			card.show(pCenter, "scanItem");
        		//判断事件源并选择执行。来实现。
        此窗口包含显示学生信息这一项事件,点击更新信息按钮后,(此时与数据库建立连接中),从数据库获取信息并显示。
        

        3.3浏览所有学生信息:Scan_stu类

        3.3.1简述

         此类所实现的窗口镶嵌在项目总集合窗口中,用JScrollPane scrollPane = new JScrollPane(table);//JScrollPane滚动窗格,并将table加入此窗格中;向滚动窗格中加入滑动条,在窗口中加入更新按钮,为按钮增加事件监听,点击后操作窗口调用Query()之中的方法显示数据库最新信息。

        在这里插入图片描述

        3.3.2核心实现代码解释

        Scan_stu(){
        		setLayout(new FlowLayout());
        		setBackground(Color.green);
        		query=new Query();//声明创建Query函数对象。
        		query.setTableName("stu");//初始化setTableName
        		a=query.getRecord();//获取表格的表头内容
        		b=query.getField();//获取表格的数据内容
        		update_table=newDefaultTableModel(a,b);//DefaultTableModel 返回Object的一个列类。
        		table=new JTable(update_table);
        		button=new JButton("更新信息");//新增按钮,初始化名称。
        		button.addActionListener(this);//为此按钮增加监听器
        		JScrollPane scrollPane = new JScrollPane(table);//在可滑动面板中加入表格table
        		scrollPane.setBounds(0,0,550,380);//设置滚动窗格面板格式大小
        		table.setPreferredSize(new Dimension(scrollPane.getWidth()-50,scrollPane.getHeight()*2));//使表格出现滑动条
        		add(scrollPane);//将滚动窗格面板加到主窗口中。
        		add(button);//将按钮加到窗口中。
        	}public void actionPerformed(ActionEvent e){
        		a=null;b=null;
        		query=new Query();//调用Query()类方法对数据库进行修改更新。
        		query.setTableName("stu");
        		a=query.getRecord();
        		b=query.getField();
        		update_table.setDataVector(a, b); // 设置模型中的元素,它会自动显示在列表中。
        	}//实现数据库调用,输出数据库的最新状态。
        

        运行窗口测试

        在这里插入图片描述

        3.4 Scan_stu调用的Query查找函数

        3.4.1简述

         本类是该项目很重要的一部分,属于核心代码,实现了与数据库建立连接,包含求表格内容的函数、求表格内容有多少行的函数方法、求字段名称的方法、求初始表名的方法、求字段个数的方法。即为操作数据库显示而编写的类。

        3.4.2核心代码解释

        在这里插入图片描述

        查询结果的存储功能

        while(rs.next()){//此处的rs为ResultSet的一个对象,用next()方法逐个读取数据。
        				for(int k=1;k<=字段个数;k++){
        					a[m][k-1]=rs.getString(k);
        				}
        				System.out.println();
        				m++;
        			}
        //这样的ResultSet对象可以完成对数据库中表的修改,更新的方法是,把ResultSet的游标移动到你要更新的行,然后调用 updateXXX(),这个方法XXX的含义和getXXX()是相同的。
        //updateXXX()方法有两个参数,第一个是要更新的列,可以是列名或者 序号。第二个是要更新的数据,这个数据类型要和XXX相同。每完成对一行的update要调用updateRow()完成对数据库的写入,而且是在 ResultSet的游标没有离开该修改行之前,否则修改将不会被提交。
        

        3.4.3求表格内容有多少行的方法

        sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);//同上文ResultSet对象可以完成对数据库中表的修改,更新。
        			rs=sql.executeQuery("select * from "+tableName);
        			rs.last();//获取匹配元素集合中最后一个元素。
        			int rows=rs.getRow();//在此处获取表格内容的行数
        			return rows;
        

        3.4.4求字段名称的方法

        在这里插入图片描述

        int 字段个数=getZiDuan();//构造函数(求字段个数)
        			b=new String[字段个数];
        			int k=0;
        			while(rs1.next()){
        				b[k]=rs1.getString(4);// .getString()方法取数据库查出来的数据。    k++;}//以String 的形式获取此 ResultSet 对象的当前行中指定列的值。
        			con.close();	}//关闭数据库连接并释放内存。	
        		catch(SQLException e){
        			System.out.println(e);
        		}
        		return b;
        	}
        

        3.4.5求字段个数

        在这里插入图片描述

        DatabaseMetaData metadata=con.getMetaData();//得到此对象实例
        			ResultSet rs1=metadata.getColumns(null, null, tableName, null);//获取表字段信息
        			字段个数=0;
        			while(rs1.next())
        				字段个数++;//计数,返回字段个数。
        		}
        		catch(SQLException e){
        			System.out.println(e);
        		}
        		return 字段个数;
        

        3.5修改学生信息的Update_stu函数

        3.5.1简述

         构建一个Update_stu类public class Update_stu extends JPanel implements ActionListener//修改学生信息的Update_stu方法。在其中设置修改信息窗口的格式添加各种组件(按钮,文本框,标签),并用事件监视,获取文本框中的字符串,调用Query查找函数里的构造方法最终实现对数据库的更改。

        3.5.2具体实现核心代码

        在这里插入图片描述

        	JTextField field[]=null;//文本框数组的声明与赋值
        	String a[]=null;//此数组存放的是数据库表格中的“表头名称”。
        	query.setTableName("stu");//找到名为“stu”的表格
        	a=query.getField();//获取字段值的方法。
        	field =new JTextField[n];//有几个值就建立几个文本输入框
        for(int i=0;i//该for循环实现了显示修改信息窗口中的标签和文本框的设置。
        	field[i]=new JTextField(10);
        	if(a[i].equals("学号")==true)
        		box1.add(new JLabel("* "+a[i]));
        	else
        		box1.add(new JLabel("  "+a[i]));//增加标签和文本框
        		box1.add(Box.createVerticalStrut(12));//表头的垂直间距
        		box2.add(field[i]);
        		box2.add(Box.createVerticalStrut(8));//文本框的垂直间距
        对数据库进行操作:
        Update update=new Update();//调用update方法对数据库进行操作。
        		update.setTableName("stu");
        		update.setField(field);
        		update.setA(a);
        		update.Execute_Update(mark);
        		JOptionPane.showMessageDialog(this, "更新成功!!","消息对话框",JOptionPane.WARNING_MESSAGE);
        

        3.5.3事件处理描述

        在这里插入图片描述

        发生事件1:当填完数据后,点击“修改”按钮:判断标签数组的第一个项,若为‘学号’且文本框数组第一项为空,触发事件弹出消息提示框提示:“带*的文本框必须填写!!”。

        发生事件2:填完数据后,点击“修改”按钮:触发事件弹出消息提示框显示:“请确保你的学号是正确的,否则会更新失败!!!如果学号错误请先删除再添加”。

        窗口实现测试

        在这里插入图片描述

        3.6用于修改数据库的函数:Update

        3.6.1简述

         Update类,通过先对数据库进行连接,获取数据库的数据,再通过事件监视,比对用户输入内容与数据库的内容,比对成功后触发事件,将用户输入的信息覆盖原数据库信息。

        3.6.2具体实现以及核心代码

        在这里插入图片描述

        if(i!=mark)//即:当数据库中无学号与之对应的时候,执行下一条赋值语句。
        SQL[i]="update "+tableName+" set "+a[i]+" ='"+field[i].getText().toString()+"' where "+a[mark]+" ='"+field[mark].getText().toString()+"'";//此条语句是赋值语句,将用户输入文本框中的内容取出来,赋值给SQL[i]数组。
        	for(int i=0;i 
        

        3.7添加学生信息函数:Insert_Stu

        3.7.1简述

         创建Insert_Stu类:public class Insert_stu extends JPanel implements ActionListener,类似与前文的Update_stu实现方式大致相同,在其中设置修改信息窗口的格式添加各种组件(按钮,文本框,标签),并用事件监视,获取文本框中的字符串,调用insert方法里的构造方法最终实现对数据库处理即新增数据库成员。

        3.7.2核心代码及其实现

        在这里插入图片描述

        JTextField field[]=null;//文本框数组的声明与赋值
        	String a[]=null;//此数组存放的是数据库表格中的“表头名称”。
        	query.setTableName("stu");//找到名为“stu”的表格
        	a=query.getField();//获取字段值的方法。
        	field =new JTextField[n];//有几个值就建立几个文本输入框
        for(int i=0;i//该for循环实现了显示修改信息窗口中的标签和文本框的设置。
        	field[i]=new JTextField(10);
        	if(a[i].equals("学号")==true) box1.add(new JLabel("* "+a[i]));
        else box1.add(new JLabel("  "+a[i]));//增加标签和文本框
        	 box1.add(Box.createVerticalStrut(12));//表头的垂直间距
        	 box2.add(field[i]);
        	  box2.add(Box.createVerticalStrut(8));//文本框的垂直间距
        if(i==n){//当循环经历次数等于文本框个数时执行此语句。
        		Insert insert=new Insert();//声明并创建Insert对象
        		insert.setTableName("stu");
        		insert.setField(field);
        		insert.setA(a);
        		insert.Execute_Insert(mark);
        			}//调用Insert中的方法操作数据库,将数据插入到数据库中即更新数据库。
        

        3.7.3事件处理描述

        在这里插入图片描述

        事件1:当field[i].getText().toString()的值有为空的时候,触发事件,弹出消息对话框显示:必须全部填写。

        事件2:当i=n时,即处理完事件1后触发事件2:调用Insert中的方法操作数据库,将数据插入到数据库中即更新数据库。

        窗口实现测试:

        在这里插入图片描述

        3.8添加学生信息函数:Insert

        3.8.1简述

         类似Update方法函数;Insert类,通过先对数据库进行连接,获取数据库的数据,再通过事件监视,比对用户输入内容与数据库的内容,比对成功后触发事件,将用户输入的信息插入数据库中更新数据库信息。

        3.8.2核心代码及其实现

        在这里插入图片描述

        url="jdbc:sqlserver://localhost:1433;DatabaseName=Student";
        SQL="insert"+tableName+"("+a[mark]+")values('"+field[mark].getText().toString()+"')";//此条语句是赋值语句,将用户输入文本框中的内容取出来,赋值给SQL[i]数组。
        		con=DriverManager.getConnection(url,"ast","123456");
        //连接数据库,账户为ast,密码为123456;
        		sql=con.createStatement();//通过connection数据库链接对象 创建一个statement对象数据库操作对象
        		sql.execute(SQL);// 用于执行返回多个结果集、多个更新计数或二者组合的语句  con.close();
        		update =new Update();//声明并创建update对象。
        		update.setTableName(tableName);
        		update.setField(field);
        		update.setA(a);
        		update.Execute_Update(mark);//以上为update调用自身方法操作数据库。JOptionPane.showMessageDialog(this, "添加成功!!!","消息对话框",JOptionPane.WARNING_MESSAGE);//触发事件:显示消息对话框‘添加成功‘,属于警告对话框。
        			for(int i=0;i 
        

        3.9查找学生信息的Search_stu函数

        3.9.1简述

         类似于插入函数与更改函数,本修改函数也是先实现窗口,通过加载标签和文本框以及按钮等组件,输出时也要有一个窗口,在其中加入一个可滚动窗格,并加载滑动条组件,将表格放在窗格中,在调用Search函数,从数据库获取数据显示出来。

        3.9.2核心代码解释及实现

        在这里插入图片描述

        field =new JTextField[n];//有几个标签就创建几个文本框,
        		for(int i=0;i//有几个标签就执行几次循环。
        			box[i]=Box.createHorizontalBox();
        			field[i]=new JTextField(8);
        		if(a[i].equals("学号")==true){//如果首项是学号这两个字
        			box[i].add(new JLabel("  "+a[i]));//载入标签到窗口中
        				box[i].add(Box.createHorizontalStrut(8));
        				box[i].add(field[i]);//载入文本框到窗口中。
        

        3.9.3事件处理描述

        在这里插入图片描述

        for(i=0;i
        		if(field[i].getText().toString().equals("")==true)
        			sum++;
        	}//计数功能,为下文初始化sum。
        	System.out.println(sum);
        	if(sum==n)//即:程序窗口框中的文本框中无任何内容!
        		JOptionPane.showMessageDialog(this, "你未输入任何内容,请重新输入!","消息对话框",JOptionPane.WARNING_MESSAGE);//触发事件:弹出消息对话框提示警告你未输入任何内容,请重新输入!
        	else{
        		Search search=new Search();
        		search.setTableName("stu");
        		search.setField(field);
        		search.setA(a);
        		search.Execute_Search();	
        		object=null;b=null;
        		query=new Query();
        		query.setTableName("stu");
        		object=search.getRecord();
        		search_table.setDataVector(object, a);
        	}//调用Search类中各个方法操作数据库,并显示内容。
        

        窗口实现测试

        在这里插入图片描述

        3.10查找函数Search

        3.10.1简述

         查找函数的构建与前面插入函数、浏览函数等都是相同的构建方法,都是先于数据库建立连接,获取其中的数据,与自身数据相比,从而根据具体要求实现查找、插入、更改等操作。

        3.10.2核心代码实现及解释

        在这里插入图片描述

        for(int i=0;i//有几个标签就执行几次这个循环。
        	if(field[i].getText().toString().equals("")==false){//当文本框为空的时候执行
        	if(sum==0)
        		SQL=SQL+a[i]+" = '"+field[i].getText().toString()+"'";//赋值语句,包含标签和文本框中的内容。
        	else
        SQL=SQL+" and "+a[i]+" = '"+field[i].getText().toString()+"'";
        	sum++;
        			}
         
        while(rs.next()){
        		for(int i=1;i<=a.length;i++){
        			object[ncase][i-1]=rs.getString(i);
        				}
        				ncase++;
        			}
        			con.close();
        	for(int i=0;i 
        

        在这里插入图片描述

        4. 测试数据

        4.1管理员登录窗口测试

        在这里插入图片描述

        4.2项目总窗口测试(设置显示为信息总览组件窗口)

        在这里插入图片描述

        在这里插入图片描述

        4.3修改信息窗口测试

        在这里插入图片描述

        在这里插入图片描述

        在这里插入图片描述

        4.4添加信息窗口测试

        带星花的项是必须要填的(学号),其余项允许为空。

        在这里插入图片描述

        在这里插入图片描述

        4.5查找信息窗口测试

        可以分类别查询 例如下图是按学号查询的,也可以按性别查询或者是按出生日期查询等等。

        在这里插入图片描述

        按学号查询

        在这里插入图片描述

        按性别查询

        在这里插入图片描述

        5. 总结

          这次课程设计我收获了很多,遇到了很多的困难,其中最让我印象深刻的就是对于本地数据库的构建:在未接触数据库操作的前提下,我没有被苦难困难吓倒,而是迎面直上;我先是查阅课本,在发现课本上是内置数据库和我计划要用的数据库不同,我直接改变方向:百度!光是下载组件就花了很长时间;然后自己又为SQL server配置环境变量,安装管理器以操作管理SQL server。这其中困难重重,所以我去实验室请教老师,获益匪浅,最后花了将近半天的时间处理好,在没有任何知识储备的条件下完成了数据库的搭建。

          接下来就是连接数据库,我又回到课本,发现语句是通用的,几经周折,我终于完成了数据库的构建并成功连接!在探索的过程中我发现,遇到困难不能死板的去处理,要灵活,利用一切可利用资源来帮助自己。在向老师请教的过程中,我学会了一中很重要并且很实用效果很好的发现错误代码的方法:注释代码!一部分一部分的去运行测试,将出错代码的范围缩小,从而发现错误并进行修改。在课程设计的过程中,对于有些同学在数据库这方面有相关问题的,我都会热心的帮助他们,当然同时也巩固了自己的能力。而从他们的代码或者编码思想中我也能获益良多,互相促进,共同进步。

          有关项目设计部分来说的话:我将项目文件分为10个部分:首先有两个窗口:管理员登录窗口以及实现其他功能的总窗口;其次就是查找类、插入类、浏览类、修改类这四个项目核心类,最后这四个核心具体实现类又一一对应这四个函数:查找、插入、浏览(查看)、修改,共10个部分在同一个package中,故对于访问权限问题没有过于重视,大部分都为友好类或者友好方法,具体实现在上文已有详细说明,故此处不在赘述。

          总之,这次的JAVA课程设计题目对于我而言还是有一定难度的;包括代码的编写以及数据库的创建及连接。但我利用一切可利用资源,教材、网络、老师、同学,最终完成了课程设计项目,说实话 这是一个煎熬的过程,包括读代码、写代码以及上网搜相关知识,期间由于作息不规律导致上火、眼睛模糊,不过等最终程序运行的那一刻,一切都值得了。我获益良多!

        6.参考文献

        Java大学实用教程(第四版);编著:耿祥义、张跃平;出版社:电子工业出版社;出版日期:2005年3月第一版。CSDN各大上传者。

        惊喜

        既然你看到了这里,需要项目源码的话那就私我叭~

        由于太多人私信根本回复不过来啦!,我已经将项目文档打包发到了这篇文章上,大家需要的可以自行下载!