学生学籍管理信息系统(共33页).doc
精选优质文档-倾情为你奉上大理学院数学与计算机学院数据库系统设计课程设计报告班级: 学号:XXXXXXX 姓名:XXXXXXX 系统名称:学生学籍管理信息系统 总分: 1、需求分析学生学籍管理工作包括学生档案、学籍、成绩、升学等内容的管理;面对大量的学生数据、报表,手工处理方式已经很难跟上现代化的步伐。随着计算机技术及网络通讯技术的飞速发展,许多学校已经有了较好的计算机应用甚至网络硬件建设基础。因此为提高学校管理工作的现代化、科学化水平,保证信息处理的即时化、准确化,开发一套对学生学籍进行管理的软件是极其重要的。1.1 系统功能1.1.1本系统应完成的主要功能(1)学生档案的管理,即录入、修改、查询、输出学生档案信息,这些信息包括学生基本情况、学生简历情况、学生奖励情况、学生处分情况、学生家庭信息、学生体检情况。 (2)学生成绩管理,录入修改、查询、输出学生入校成绩,各学期、各门课程的成绩信息,并支持按年级、班级等条件的统计、查询、报表输出。1.1.2 本系统功能需求(1)按系汇总各专业各年级的学生总数及其中的男、女生数,并统计全校总人数。要求:当任意输入系部名称、专业名称和年级均可返回相应信息。(2)按系汇总各年龄段的学生人数及其中的男、女生数。 要求:当任意输入系部名称、年龄时,均可返回相应信息。(3)按系统计各地区的学生人数。 要求:当任意输入系部名称、地区名称时,均可返回相应学生人数。(4)按系统计学生中的党员、团员人数。 要求:当任意输入系部名称时,均可返回该系的学生党员和团员人数。(5)按系统计各民族的学生人数。 要求:当任意输入系部名称、民族时,均可返回相应信息。(6)按学年根据学生变更数据自动修改班级总人数(提示:用触发器实现)、系部总人数、学校总人数。(7)统计各门课程的成绩分布情况: 其中:1) (90-100、80-90、70-80、60-70、0-59)的人数及各自占实际考试人数的百分比数。2) 统计缺考人数。3) 统计及格、不及格人数。(8)统计每个学生的综合测评总成绩:1) 总成绩=平均分*0.7+德体分*0.32) 综合测评的排名。3) 根据总成绩评定奖学金等级(特等、一等、二等、三等)。4) 按学年根据学生学习情况确定升、留级人选(补考三门(以上)不及格或毕业补考一门(以上)不及格)。(9)学生成绩查询(分别按学号、姓名、班级、课程、开设学期),显示信息自定。(10)更改信息时,相关表的相应记录也应随之更改。(如:留级、补考等)(11)触发器的应用:如:假设已存在“学生”、“成绩”、“课程”三个表,其中“学生”表包括学号,姓名等字段,“成绩”表包括学号,课程代码,成绩等字段,“课程”表包括课程代码,课程名称等字段。 当向“学生”表中添加一条新的学生信息后,在“成绩”表中添加该学生所学课程信息,并确保课程代码字段的取值是“课程”表中的已有数据。(12)子查询的应用:查找“计应041”班高于“计应042”班总评成绩最高分的学生记录。(13)创建如下视图并显示对应的数据:1) V_学生成绩:包括学生姓名、课程名称、成绩2) V_班级人数:包括班级名称、系别、专业名称、班级人数1.2 分析过程1.2.1本系统的数据流图(1)学生学籍管理信息系统数据流图(2)学生档案管理数据流图(3)学生学籍管理数据流图(4)学生成绩管理数据流图(5)系统管理数据流图1.2.2 数据字典(1)数据字典的用途进行详细的数据收集和数据分析所获得的主要结果(2) 数据字典的内容§ 数据结构§ 数据项§ 数据流§ 数据存储§ 处理过程(3)表关系说明1)学生表字段名数据类型含义说明约束情况snoChar(10)学号主关键字snameChar(10)姓名可为空ssexChar(2)性别可为空sageint年龄可为空smzChar(10)民族可为空sjgChar(10)籍贯可为空szzmmChar(10)政治面貌可为空sdepartChar(10)系部可为空smajorChar(10)专业可为空sgradeChar(10)年级可为空sclassint班级可为空srxcjsmallint入校成绩可为空ssfbyChar(10)是否毕业可为空sbyrqdatetime毕业日期可为空2)课程表字段名数据类型含义说明约束情况cnoint课程号主关键字cnamechar(10)课程名可为空cyearChar(10)开设学年可为空ctermChar(10)开设学期可为空3)成绩表字段名数据类型含义说明约束情况snoint学号主关键字cnoint课程号主关键字scoresmallint成绩可为空4)奖惩表字段名数据类型含义说明约束情况snoint学号主关键字rtypeChar(10)类型可为空rdatedata日期可为空5)班级表字段名数据类型含义说明约束情况bhint 编号主关键字yxChar(20)院系可为空mcChar(10)名称可为空rsint人数可为空6)教师表字段名数据类型含义说明约束情况tnoint教工号主关键字tnameChar(10)姓名可为空tsexChar(10)性别可为空tprofessChar(10)职称可为空ttelint电话可为空2、数据库设计2.1 数据库概念设计数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。目标:为用户和各种应用系统提供一个信息基础设施和高效率的运行环境。2.1.1 表的建立(1)学生表(2)课程表(3)成绩表(4)奖惩表(5)班级表(6)教师表2.1.2 表的信息(1)学生表(2)课程表(3)成绩表(4)奖惩表(5)班级表(6)教师表2.1.3 E-R图(1)学生实体包含学号,姓名,性别,年龄,民族,籍贯,专业,年级,班级,政治面貌,入校成绩以及是否毕业等属性。(2)课程实体包含课程号,课程名,开设学年以及开设学期四个属性。(3)成绩实体有学号,课程号和成绩3个属性。(4)奖惩实体包括学号,类型以及日期三个属性。(4)班级实体包括编号,院系以及名称三个属性。(5) 教师实体包括教工号,姓名,性别,职称,电话等属性。(6)学生实体与课程实体是一个多对多(m:n)的选修关系,学生,课程和和成绩3个实体也是一个多对多(m:n:p)的考试关系。2.2数据库的逻辑设计2.2.1 关系模型将E-R图转换为关系模型实际上就是要奖实体型、实体的属性和实体型之间的联系转换为关系模式,这种转换一般遵循如下原则:一个实体型转换为一个关系模式。实体的属性就是关系的属性,实体的码就是关系的码。对于实体型间的联系则有以下不同的情况:(1)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的个实体的码以及联系本身的属性均转换为关系的属性,每个实体的码均是该关系的侯选码。如果与某一端实体对应的关系模式合并,则需要在关系模式的属性中加入另一个关系模式的码和联系本身的属性。(2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的个各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。(3)一个m:n联系转换为一个关系模式。与该联系相连的个实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分。(4)3个或3个以上实体间的一个多元联系可以转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分。(5)具有相同码的关系模式可合并。将概念结构设计阶段设计好的基本E-R图转换为关系模型,如下所示:1) 学生(学号,姓名,性别,年龄,民族,籍贯,系部,专业,年级,班级,政治面貌,入校成绩,是否毕业,毕业日期)。2) 课程(课程号,课程名,开设学年,开设学期)。3) 成绩(学号,课程号,成绩)。4) 奖惩(学号,类型,日期)。5) 班级(编号,院系,名称)。6)教师(教工号,姓名,性别,职称,电话)。 2.2.2 创建视图 (1)V_学生成绩:包括学生学号,姓名、课程名称、成绩Create view v_scoureAsSelect sno,sname,cname,scoreFrom student,coure,scoreWhere student.sno=score.sno(2)V_班级人数:包括班级名称、系别、专业名称、班级人数Create view v_classAsSelect cclass,sdepart,smajor,rsFrom student,coure,score 2.2.3 创建索引(1)创建学生表的索引学生表:先点击右键,然后选择修改。在弹出的界面中选择索引页面,索引名为index,类型为主索引,表达式为学号。 (2)创建课程表的索引课程表:先点击右键,然后选择修改。在弹出的界面中选择索引页面,索引名为index1,类型为主索引,表达式为课程号。 (3)创建成绩表的索引成绩表:先点击右键,然后选择修改。在弹出的界面中选择索引页面,索引名为index2,通索引,表达式为课程号;索引名为xh,类型为主索引,表达式为学号。(4)创建奖惩表的索引奖惩表:先点击右键,然后选择修改。在弹出的界面中选择索引页面,索引名为index3,类型为主索引,表达式为学号。(5)创建班级表的索引(6)创建教师表的索引2.2.4 数据表之间的逻辑关系3、系统实现3.1 数据库访问(1)数据访问类及实现代码1)触发器触发器是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,任何用户对表的增、删、改操作均由服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。由于本系统的触发器比较多,在这里我只写出了其中的一部分触发器,具体如下所示。数据更新:CREATE TRIGGER studentupdate ON dbo.student FOR UPDATE ASUPDATE STUDENT SET SNO = (SELECT SNO FROM INSERTED)WHERE SNO = (SELECT SNO FROM DELETED); CREATE TRIGGER courseupdate ON dbo.course /FOR UPDATE ASUPDATE COURSE SET SNO = (SELECT CNO FROM INSERTED)WHERE SNO = (SELECT CNO FROM DELETED);CREATE TRIGGER scoreupdate ON dbo.student FOR UPDATE ASUPDATE SCORE SET SNO = (SELECT SNO FROM INSERTED)WHERE SNO = (SELECT SNO FROM DELETED);CREATE TRIGGER student1 ON dbo.major FOR UPDATE ASUPDATE STUDENT SET MNO = (SELECT MNO FROM INSERTED) WHERE MNO = (SELECT MNO FROM DELETED); CREATE TRIGGER student2update ON dbo.departFOR UPDATE ASUPDATE STUDENTSET DMPNO = (SELECT DMPNO FROM INSERTED)WHERE DMPNO = (SELECT DMPNO FROM DELETED); 数据删除:CREATE TRIGGER teach1update ON dbo.teacher FOR DELETE ASUPDATE TEACH SET TNO = NULL WHERE TNO = (SELECT TNO FROM DELETED);CREATE TRIGGER stu_majorupdate ON dbo.major FOR DELETE ASUPDATE STUDENT SET MNO = NULL WHERE MNO = (SELECT MNO FROM DELETED);CREATE TRIGGER teacherupdate ON dbo.depart FOR DELETE ASUPDATE TEACHER SET DMPNO = NULL WHERE DMPNO = (SELECT DMPNO FROM DELETED) 2)java访问数据库及代码package DBCONN;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class Conmysql /这是mysql的连接字符串private static String url = "jdbc:mysql:/127.0.0.1:3306/finaltest?useUnicode=true&characterEncoding=UTF-8"static Connection conn = null;/定义一个,后面用static Statement stmt = null;/定义一个空查询语句,后面用static ResultSet rs = null;/定义一个空的返回结果集,后面用static Object result;public static Object exqutesql(String sql) try /注册mssql驱动Class.forName("com.mysql.jdbc.Driver");/连接数据库conn = DriverManager.getConnection(url, "root", "root");/准备查询语句stmt = conn.createStatement();String beginsql = ""beginsql = sql.trim().substring(0, 1);/ boolean execute = stmt.execute(sql);/判断sql的类型,是insert/select/delete/update/注意:只有select才能是executeQuery,其他三种都是executeUpdateif (beginsql.equalsIgnoreCase("i") result = stmt.executeUpdate(sql);/ System.out.println(result); /if (beginsql.equalsIgnoreCase("s") result = stmt.executeQuery(sql);/保存查询结果到result,下同if (beginsql.equalsIgnoreCase("d") result = stmt.executeUpdate(sql);if (beginsql.equalsIgnoreCase("u") result = stmt.executeUpdate(sql);System.out.println(result);/ System.out.println(tag); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace(); finally /注意:最后的时候要关闭所有连接,首先是stmt,然后是conn/ try / stmt.close();/ conn.close();/ catch (SQLException e) / / TODO Auto-generated catch block/ e.printStackTrace();/ return result;(2) SQL语句USE xsxjglGO/* 对象: Table dbo.student 脚本日期: 05/07/2014 11:07:39 */SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE dbo.student(sno char(10) NOT NULL,sname char(10) NULL,ssex char(2) NULL,sage int NULL,smz char(10) NULL,sjg char(10) NULL,sdepart char(30) NULL,smajor char(30) NULL,sgrade int NULL,sclass smallint NULL,szzmm char(10) NULL,srxcj smallint NULL,ssfby char(10) NULL,sbyrq datetime NULL, CONSTRAINT PK_student PRIMARY KEY CLUSTERED (sno ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY) ON PRIMARYGOSET ANSI_PADDING OFFGO/* 对象: Table dbo.rewardpunish 脚本日期: 05/07/2014 11:07:39 */SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE dbo.rewardpunish(sno int NOT NULL,rtype char(10) NULL,rdate datetime NULL) ON PRIMARYGOSET ANSI_PADDING OFFGO/* 对象: Table dbo.class 脚本日期: 05/07/2014 11:07:39 */SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE dbo.class(bh int NOT NULL,yx char(20) NULL,mc char(20) NULL,rs int NULL, CONSTRAINT PK_class PRIMARY KEY CLUSTERED (bh ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY) ON PRIMARYGOSET ANSI_PADDING OFFGO/* 对象: Table dbo.teacher 脚本日期: 05/07/2014 11:07:39 */SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE dbo.teacher(tno int NOT NULL,tname char(10) NULL,tsex char(2) NULL,tprofess char(10) NULL,ttel char(10) NULL, CONSTRAINT PK_teacher PRIMARY KEY CLUSTERED (tno ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY) ON PRIMARYGOSET ANSI_PADDING OFFGO/* 对象: Table dbo.score 脚本日期: 05/07/2014 11:07:39 */SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE dbo.score(sno int NOT NULL,cno int NOT NULL,score smallint NULL, CONSTRAINT PK_score PRIMARY KEY CLUSTERED (sno ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY) ON PRIMARYGO/* 对象: Table dbo.course 脚本日期: 05/07/2014 11:07:39 */SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE dbo.course(cno int NOT NULL,cname char(20) NULL,cyear char(10) NULL,cterm char(10) NULL) ON PRIMARYGOSET ANSI_PADDING OFFGO3.2 业务逻辑层类及代码(1)数据查询语句格式:SELECT ALL/DISTINCT <目标列名表达式> 别名 ,<目标列名表达式> 别名FROM <表名或视图名> 别名, <表名或视图名> 别名WHERE<条件表达式>GROUP BY<列名1>HAVING<条件表达式>ORDER BY <列名2>ASC/DESC;查询查询所有选修了1001号课程的学生姓名SELECT snameFROM studentWHERE EXISTS(SELECT * FROM SC WHERE Sno=student.sno AND cno=1001)(2)数据删除语句格式:DELETEFROM<表明>WHERE<条件>删除学号为的学生记录DELECTFROM studentWHERE sno=(3)数据修改语句格式:UPDATE<表名>SET <列名>=<表达式>, <列名>=<表达式>WHERE<条件>将所有学生的年龄加1UPDATE studentSET sage=sage+1(4)插入数据语句格式:INSERTINTO<表名>(<属性列1><属性列2>)VALUES(<常量1>,常量2.);在学生表中插入Insert into student(sno,sname,ssex,sage,smz,sjg,szzmm,sdepart,smajor,sgrade,sclass,srxcj,ssfby,sbyrq)values(,王强,男 20,汉族,云南 ,团员,数学与应用数学,2011 2,412,是,2013/6/7)在课程表中插入Insert into course(cno,cname,cyear,cterm)values(1022,JAVA,2013 1)在成绩表中插入Insert into score(cno,cno,score)values(,1022,67 )3.3表示层的实现(1)登陆import java.util.Scanner;import java.sql.*;public class Student static boolean flag; /标记是否为管理员static int i =0; /限制密码输入次数static String present_name; /记录当前用户public static void log_in(String name,String pwd) throws Exception/用户登录验证String DBDrive = "sun.jdbc.odbc.JdbcOdbcDriver"String connectionStr = "jdbc:odbc:conn"Connection con = null;Statement stmt = null;ResultSet rs = null;Class.forName(DBDrive); con = DriverManager.getConnection(connectionStr,"sa","sa");stmt = con.createStatement();rs = stmt.executeQuery("Select * From users where username= '"+name+"' and password= '"+pwd+"'");if(rs.next()System.out.println("登录成功!");(2)主界面 public void show_DataBase_Information()/显示数据库中学生的个人基本信息 String Information; if(ConnectDataBase() try str="SELECT* FROM Student_Basic_Information" ResultSet s1=st1.executeQuery(str); int i=0; while(s1.next() if(i>MaxNum) break; Information=s1.getString(1)+"t"+s1.getString(2)+"t"+s1.getString(3)+"t"+s1.getLong(4) +"t"+s1.getString(5)+"t"+s1.getString(6)+"n" Student_Informationi=Information; i+; NowInformationNum=i; Close_database(); catch(SQLException e) System.out.println(e.toString(); public boolean Query_Database_Information(String sno)/显示查询数据库中学生信息if(ConnectDataBase() try str="select* from Student_Basic_Information where 学号='"+sno+"'" ResultSet s1=st1.executeQuery(str); int i=0; while(s1.next() temptInformation=s1.getString(1)+"t"+s1.getString(2)+"t"+s1.getString(3)+"t"+s1.getLong(4) +"t"+s1.getString(5)+"t"+s1.getString(6)+"n" i+; Close_database(); if(i>0) return true; catch(SQLException e) e.printStackTrace(); return false; return false; public void Add_Database_Information(String sno,String name,String *,int age,String classname,String dept) /向数据库中加入新生的基本信息if(ConnectDataBase() try str="INSERT INTO Student_Basic_Information"+"(学号,姓名,性别,年龄,民族,籍贯,系部,专业,年级,班级,入校成绩,是否毕业,毕业日期)" str=str+"VALUES('"+sno+"','"+sname+"','"+sage+"',"+smz+",'"+sjg+"','"+sdepart+"',”smajor”+”sgrade”+”sclass”+”srxcj”+”ssfby”+”sbyrq”)" st1.executeUpdate(str); Close_database(); catch(SQLException e) e.printStackTrace(); return; JOptionPane.showMessageDialog(null,"加入新生记录操作成功!","HAPPY MESSAGE",JOptionPane.PLAIN_MESSAGE);public boolean Del_Database_Information(String sno)/删除数据库中某个学生的基本信息 if(ConnectDataBase() try str="DELETE FROM Student_Basic_Information WHERE 学号='"+sno+"'" st1.executeUpdate(str); Close_database(); catch(SQLException e) e.printStackTrace(); return false; return true; return false;