基于java的简单学生信息管理程序.docx
《基于java的简单学生信息管理程序.docx》由会员分享,可在线阅读,更多相关《基于java的简单学生信息管理程序.docx(22页珍藏版)》请在冰点文库上搜索。
基于java的简单学生信息管理程序
《基于java的简单学生信息管理程序》
一、目的:
1、复习、巩固Java语言的基础知识,进一步加深对Java语言的理解和掌握;
2、课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力;
3、培养学生在项目开发中团队合作精神、创新意识及能力。
二、要求:
1、对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;
2、系统设计要实用,编程简练,可用,功能全面
3、说明书、流程图要清楚
4、记录设计情况(备查,也为编写设计说明书作好准备);
5、要求采用模块化程序设计方法,及锯齿型书写格式,要求上机调试通过和按设计报告格式。
6、设计上交内容:
设计报告一份(按格式书写);源程序文件(刻录成光盘)。
三、课程设计内容:
1、开发背景:
◆某学校中有很多学生,为了方便管理,要求实现一个程序对该学校学生的信息进行统一管理。
◆学生的属性及程序功能如下:
Ø学生公有信息:
ID、姓名、年龄。
Ø学生有成绩。
Ø所有信息要求保存在文件和数据库中,可以对信息进行添加、修改、查询和删除等操作。
Ø在查询信息时要求由高到低排序输出(学生按成绩高低,如果相等,则按年龄由高到低排序输出。
)。
2、分析开发背景:
ID、姓名和年龄为学生分有信息,而学生有成绩,因此定义一个抽象类Person(ID、姓名、年龄),学生是其子类,有成绩。
在程序中ID是自动生成,最好的方式是采用如下的编码方式:
·标记+时间戳+三位随机数
例如:
2012年12月12日18:
10:
10:
345
学生的标记为S
生成的ID号:
学生→S20121212181010345001
因为程序要求要满足对文件和数据库的操作,而对文件和数据库操作是一种标准,因此应该定义一个公共的标准————接口
查询信息的时候要求对查询出的信息进行排序操作,这一操作可以使用Comparable接口完成。
整个程序代码中牵扯到数据层的操作,而数据层就是指对真实的数据的操作,最终操作的是一个人,操作的是学生管理。
数据层操作标准定义完成之后,可以有两种选择,一种是直接使用子类实现,但是此种做法以后的修改不是很方便,另一种是使用代理设计的思路完成。
因此要做一个中间层,代码关系如下:
Main→Menu→PersonOperate→DAO
因为程序要求保存在文件的数据库中,所以此处可以设计出一个工厂,通过此工厂进行DAO的操作子类实例取得。
3、分析总结:
根据上面对开发背景的分析,总结出以下模块:
●程序运行入口层模块(main):
此模块主要是作为程序运行入口点,调用主菜单模块相应的类。
用到的类:
Main
●主菜单层模块(menu):
显示主菜单,主菜单要有全部的学生信息管理,应该还有一个退出操作。
在学生信息管理的界面中分别有对学生信息的增加信息、列出全部信息、查询信息、删除信息、修改信息和返回上一级的操作。
用到的类:
Menu
●操作层模块(operate):
该模块主要是实现对学生的增加信息、列出全部信息、查询信息、删除信息和修改信息。
为了使程序有较大的伸缩性,首先定义一个操作标准----接口,让对学生的操作去实现该接口,然后根据需要增加相应功能。
此模块的操作方法首先调用工厂层模块中的方法取得相应实例,然后通过实例调用数据操作层模块中相应的方法来实现相对应的功能。
用到的类:
PersonOperateStudentOperateWorkerOperate
●数据操作层模块(dao):
该模块主要是定义对具体数据的操作,首先定义一个标准,在标准中有相应的对数据具体操作的方法。
让子类(实现模块中的子类)去实现这个标准,然后根据需要增加相应的功能。
此子类调用IO操作模块的保存方法将对象保存。
用到的类:
PersonDAO
●文件操作层模块(io):
该模块主要是将对象(学生信息)保存在文件和数据库且能把对象(学生信息)从文件和数据库中读出来。
用到的类:
FileOperate
●数据库连接模块(dbc):
该模块主要是连接数据库。
用到的类:
DataBaseConnection
●实现层模块(impl):
该模块主要是定义子类去实现数据操作模块(dao)中定义的标准。
在这一模块中有一个子类功能是将对象(学生信息)保存在文件(*.txt)中,有一个则是将对象(学生信息)保存在数据库(MySQL)中。
保存在文件中的子类去调用文件操作模块(io)中的相应方法实现,保存在数据库中的子类直接通过SQL语句将对象(学生的信息)保存在数据库中。
用到的类:
PersonDAOImplFilePersonDAOImplJDBC
●代理操作模块(proxy):
该模块主要是为了清晰开发思路,使用了代理设计思路去开发,实现层模块(impl)不直接去操作,而是将操作交给代理层去操作。
用到的类:
PersonDAOProxyFilePersonDAOProxyJDBC
●工具层模块(util):
该层一是实现输入数据,并对数据的合法性进行检验,使用正则表达式检验;二是实现对学生ID号的生成。
用到的类:
InputDataTimeStamp
●对象层模块(vo):
该模块主要是存放实实在在的对象。
定义一个抽象类,然后在定义一个子类(学生类)去继承。
用到的类:
PersonStudentWorker
●工厂层模块(factory):
该模块主要是根据操作层模块传来的参数产生实现层模块的对象,参数也传递过去,参数主要是为了在查询时能指明要查询哪种类型的对象。
用到的类:
DAOFactory
4、用例图:
系统管理员
类与类之间关系图:
5、使用到的知识:
Java基础知识(分支选择、循环等),Java面向对象,抽象类,接口,异常,I/O操作(序列化和反序列化等),JDBC操作MySQL数据库,类集(Collection(SetTreeSet)、Iterator等),正则表达式,java类库中一些常用类。
6、程序测试
程序做完之后我准备了一些数据对做好的程序进行测试,测试数据在文件中的java课程设计测试数据里。
测试数据分为正确和不正确数据,所谓正确与不正确是相对客观存在的事物进行对比的,比如说人的年龄不可能小于0,学生的成绩不可能小于0等。
在测试时出现了以下问题:
一个人的名字不可能是数字(在这个程序中只考虑数字、字母和汉字,其他特殊符号不考虑),但能正确的增加;一个人的年龄不可能小于0,学生成绩不可能小于0;
对以上的问题,可以用正则表达式来解决,正则表达式在程序中除了以上作用以外,还有一个作用就是检验输入的内容是否为数字。
1、
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
//这个类用于添加、修改、搜索和删除记录。
classStudentDetails{
/**声明一个Statement对象。
*/
PreparedStatementstmtObj=null;
/**声明一个String变量。
*/
StringstrSql=null;
/**声明一Connection个对象。
*/
Connectioncon=null;
/**声明一个BufferedReader对象*/
BufferedReaderbufferObj=null;
//创建一个数据库连接对象
privateDataBaseConnectiondbc=null;
/**
*这是构造方法。
*/
publicStudentDetails(){
bufferObj=newBufferedReader(newInputStreamReader(System.in));
dbc=newDataBaseConnection();
}
/**
*该方法用于将记录添加到数据库中。
*/
voidaddRecord(){
try{
System.out.print("\n请输入学号:
");
introll=Integer.parseInt(bufferObj.readLine());
System.out.print("\n请输入学生的姓名:
");
Stringname=bufferObj.readLine();
System.out.print("\n请输入课程名称:
");
Stringcourse=bufferObj.readLine();
//strSql="Insertintostudentvalues('"+roll;
//strSql=strSql+"',"+name+",'"+course+"')";
strSql="insertintostudentvalues('"+roll+"','"+name+"','"+course+"')";
stmtObj=this.dbc.getConnection().prepareStatement(strSql);
stmtObj.executeUpdate();
stmtObj.close();
System.out.print("\n记录已成功添加!
\n");
System.out.println("********************************************************************************\n");
}catch(SQLExceptionioe){
System.out.println("错误2");
ioe.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*该方法用于修改数据库中的记录。
*/
voidmodifyRecord(){
try{
System.out.print("\n请输入要修改记录的学号:
");
introll=Integer.parseInt(bufferObj.readLine());
System.out.print("\n请输入学生的姓名:
");
Stringname=bufferObj.readLine();
System.out.print("\n请输入课程名称:
");
Stringcourse=bufferObj.readLine();
strSql="Updatestudentset姓名='"+name;
strSql=strSql+"'"+",课程='"+course;
strSql=strSql+"'where学号="+roll;
//strSql="updatestudentset"
stmtObj=this.dbc.getConnection().prepareStatement(strSql);
stmtObj.executeUpdate();
stmtObj.close();
System.out.print("\n记录已成功修改!
\n");
System.out.println("********************************************************************************\n");
}catch(SQLExceptionioe){
System.out.println(ioe);
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*该方法用于删除数据库中的记录。
*/
voiddeleteRecord(){
try{
System.out.print("\n请输入要删除记录的学号:
");
introll=Integer.parseInt(bufferObj.readLine());
/*
System.out.print("\n输入要删除的学生的姓名:
");
Stringname=bufferObj.readLine();
*/
//strSql="Deletefromstudentwherertrim(姓名)like'"+name;
strSql="Deletefromstudentwhere学号="+roll;
//strSql=strSql+"'and学号="+roll;
stmtObj=this.dbc.getConnection().prepareStatement(strSql);
stmtObj.executeUpdate();
stmtObj.close();
System.out.print("\n记录已成功删除!
\n");
System.out.println("********************************************************************************\n");
}catch(SQLExceptionioe){
System.out.println("删除时出错3");
ioe.printStackTrace();
}catch(Exceptione){
System.out.println("错误4");
e.printStackTrace();
}
}
/**
*该方法用于搜索数据库中的记录。
*/
voidsearchRecord(){
try{
System.out.print("\n请输入"+"要搜索记录的学号:
");
introll=Integer.parseInt(bufferObj.readLine());
/*System.out.print("\n请输入要搜的学生姓名:
");
Stringname=bufferObj.readLine();
*/
//strSql="select*fromstudentwhere姓名like'"+name;
strSql="select*fromstudentwhere学号="+roll;
//strSql=strSql+"'and学号="+roll;
stmtObj=this.dbc.getConnection().prepareStatement(strSql);
ResultSetrs=stmtObj.executeQuery();
//ResultSetrs=stmtObj.executeQuery(strSql);
if(!
rs.next()){
System.out.println("\n记录没有找到!
");
System.out.println("********************************************************************************");
}else{
System.out.print("\n姓名:
");
System.out.print(rs.getString
(2)+"\t");
System.out.print("\n学号:
");
System.out.print(rs.getInt
(1)+"\t");
System.out.print("\n课程:
");
System.out.print(rs.getString(3)+"\n");
}
stmtObj.close();
}catch(SQLExceptionioe){
System.out.println(ioe);
}catch(Exceptione){
System.out.println(e);
}
}
/**
*该方法用于向用户显示一个选择。
*/
publicvoidmenudisplay()throwsIOException{
charchoice;
System.out.println("\n\n\n");
System.out.println("*");
System.out.println("**");
System.out.println("***");
System.out.println("**");
System.out.println("*");
System.out.println("信息");
System.out.println("生****管");
System.out.println("学**理");
System.out.println("**");
System.out.println("**");
System.out.println();
System.out.println("dyf承制");
System.out.println("版权所有翻录必究");
System.out.println();
System.out.println();
System.out.print("是否确认要进入?
(Y/N):
");
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
choice=(char)br.read();
switch(choice){
case'y':
{
System.out.println("********************************************************************************");
while(true){
System.out.println();
System.out.println("欢迎使用学生信息管理系统");
System.out.println();
System.out.println("*************************");
System.out.println("*************************");
System.out.println("******");
System.out.println("**目录**");
System.out.println("**1.添加记录**");
System.out.println("**2.修改记录**");
System.out.println("**3.删除记录**");
System.out.println("**4.搜索记录**");
System.out.println("**5.退出**");
System.out.println("******");
System.out.println("*************************");
System.out.println("*************************");
System.out.println("\n");
System.out.print("开发者:
dyf");
System.out.println("\n");
System.out.println("dyf制作");
System.out.println();
System.out.println("2010年12月");
System.out.println();
System.out.print("请输入您要选择的操作序号:
");
BufferedReaderbr1=newBufferedReader(newInputStreamReader(
System.in));
choice=(char)br1.read();
switch(choice){
case'1':
System.out.println("\n正在添加记录......");
addRecord();
break;
case'2':
System.out.println("\n正在修改记录......");
modifyRecord();
break;
case'3':
System.out.println("\n正在删除记录......");
deleteRecord();
break;
case'4':
System.out.println("\n正在搜索记录......");
searchRecord();
break;
case'5':
System.out.println();
System.out.print("是否确认退出?
(