资源描述
目录
1 需求分析 2
1.1 设计任务要求 2
1.2 系统功效需求分析 2
2 概要设计 2
2.1 图形用户界面设计 2
2.2 用数据库建立学生信息表 3
2.3 数据库连接 3
2.4 模块功效实现 3
3 具体设计 3
3.1 图形用户界面设计 3
3.2 用数据库建立学生信息表 3
3.3 数据库连接 3
3.4 模块功效实现 3
4 调试分析 3
4.1 系统功效测试 3
4.2 系统调试常见错误 3
4.3 试验小结 3
5 用户使用说明 3
6 测试数据和数据结果 3
参考文件 3
附件 3
1 需求分析
利用计算机进行学生信息管理,不仅能够确保正确、无误、快速输出,而且还能够利用计算机对相关信息进行查询,检索快速、查找方便、可靠性高、存放量大、保密性好。要科学地实现信息化管理,开发一个适合学校,能够进行信息存放、查询、修改等功效信息管理系统是十分关键。我这次课题就是设计和实现一个学生信息管理系统。
1.1 设计任务要求
该学生信息管理系统设计要求关键有以下几点:
(1)使用图形用户界面;
(2)用数据库建立1或2个学生信息表;(不限使用哪种数据库)
(3)能连接数据库并实现对学生信息查询、增、删、改等功效。
1.2 系统功效需求分析
系统关键包含以下几项功效:
(1)添加学生信息;
(2)查询学生信息;
(3)删除学生信息;
(4)修改学生信息。
2 概要设计
2.1 图形用户界面设计
图形用户界面中,设置窗口大小、显示位置和窗口标题,设置窗口关闭以后其后台程序同时关闭,设置窗口可拉伸且为可见。同时设置了用户输入文本框,文本框窗口大小等属性也进行设置,文本框中可输入用户需要输入学生信息。
2.2 用数据库建立学生信息表
在这里我用是数据库mysql,建立数据库名字为student,而且程序使用是单表形式,表名为 st ,st表字段,各个字段分别对应学生学号,名字,性别,年纪,籍贯,系别。
2.3 数据库连接
数据库连接只需经过jdbc驱动,即可实现用户操作和数据资源连接,并可对相关数据库信息进行操作。
2.4 模块功效实现
以下是学生信息管理系统功效模块关系图,关键包含查询、添加、修改、删除学生信息等功效。
学生信息管理系统
查询学生信息
添加学生信息
修改学生信息
删除学生信息
图2.1 系统功效模块关系图
依据功效需要,我设想了主窗口界面大致部署图,并在设计和实现过程中尽可能去根据设想图图样去实现。设想图以下图所表示,图中也大约地标明了部分口号和说明。
主模块外出容器:
Panel3:用来显示 按钮(添加) 按钮(修改) 按钮(删除)
jscrollPane:用来显示数据库调出数据表
Panel1:标签(学生姓名) 输入框(学生姓名) 按钮(查询)
图2.2 设想主界面
图2.2中组件功效实现:
(1)当用户点击查询按钮时,系统创建一个数据库连接,从数据库调出用户所输入要查询学生信息,并显示到jscrollPane中,即主模块中部;
(2)当用户点击添加按钮时,系统创建一个数据连接,弹出一个添加学生信息文本框,文本框可输入要添加学生信息,并可存入数据库。
(3)当用户点击修改按钮时,系统创建一个数据连接,从数据库中调出你所选行学生信息,并弹出修改该学生信息文本框,文本框可进行学生信息修改,修改完确定后,该学生信息会重新存入数据库。
(4)当用户点击删除按钮时,系统创建一个数据连接,依据你所选行学生学号,在数据库中找到该学生信息,并删除。
3 具体设计
3.1 图形用户界面设计
(1)主界面窗口设计函数代码程序以下:
//定义用户界面用到组件
JLabel userName = null; //要查询学生名字
JTextField textField = null; //用户输入文本框
JButton select = null; //查询按钮
JButton insert = null; //添加按钮
JButton update = null; //修改按钮
JButton delete = null; //删除按钮
JTable table = null; //用于显示数据库调出数据表
Panel panel1 = null;
Panel panel2 = null;
Panel panel3 = null;
JScrollPane jscrollPane = null;
StModel stModel = null; //st表模型
private Object PreparedStatement;
public StuMange()
{
//窗口显示上部组件
userName = new JLabel("学生名:");
textField = new JTextField(10); //用户输入文本框限定为最多输入10个字符
select = new JButton("查询"); //查询按钮
//添加到第一个面板中
panel1 = new Panel();
panel1.add(userName);
panel1.add(textField);
panel1.add(select);
//窗口下部组件
insert = new JButton("添加");
delete = new JButton("删除");
update = new JButton("修改");
//添加到第三个个面板中
panel3 = new Panel();
panel3.add(insert);
panel3.add(delete);
panel3.add(update);
//窗口中部组件
stModel = new StModel();
stModel.insertDatabase("select * from st");
table = new JTable(stModel);
jscrollPane = new JScrollPane(table);
//注册事件监听
select.addActionListener(this);
insert.addActionListener(this);
update.addActionListener(this);
delete.addActionListener(this);
//将各个组件添加到窗体中
this.add(panel1, BorderLayout.NORTH);
this.add(jscrollPane, BorderLayout.CENTER);
this.add(panel3, BorderLayout.SOUTH);
//设置窗体属性
this.setSize(400, 300); //设置窗口大小
this.setLocation(200, 200); //设置窗口显示位置
this.setTitle("学生信息管理系统"); //设置窗口标题
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗口关闭以后其后台程序同时关闭
//设置窗口为可见
this.setVisible(true);
}
(2)添加学生界面文本框设计函数程序代码以下所表示:
private JLabel id, name, sex, age, address, dep; //分别代表学生学号,名字,性别,年纪,籍贯,系别
private JTextField jtf1, jtf2, jtf3, jtf4, jtf5, jtf6; //用户输入文本框,分别为学生学号,名字,性别,年纪,籍贯,系别
private JButton add, canel; //分别为添加按钮和取消按钮
private Panel panel1, panel2, panel3;
public InsertStudent(Frame owner, String title, boolean model)
{
super(owner, title, model); //实现和父类窗口对话
System.out.println("我实施了");
//窗体西部组件
id = new JLabel("学号:");
name = new JLabel("姓名:");
sex = new JLabel("性别");
age = new JLabel("年纪");
address = new JLabel("籍贯");
dep = new JLabel("系别:");
//添加到panel1面板中
panel1 = new Panel(new GridLayout(6, 1));
panel1.add(id);
panel1.add(name);
panel1.add(sex);
panel1.add(age);
panel1.add(address);
panel1.add(dep);
//窗体东部组件
jtf1 = new JTextField(10);
jtf2 = new JTextField(10);
jtf3 = new JTextField(10);
jtf4 = new JTextField(10);
jtf5 = new JTextField(10);
jtf6 = new JTextField(10);
//添加到第二个面板中
panel2 = new Panel(new GridLayout(6, 1));
panel2.add(jtf1);
panel2.add(jtf2);
panel2.add(jtf3);
panel2.add(jtf4);
panel2.add(jtf5);
panel2.add(jtf6);
//窗体北部控件
add = new JButton("添加");
canel = new JButton("取消");
//注册事件监听
add.addActionListener(this);
canel.addActionListener(this);
//添加到panel3面板中
panel3 = new Panel();
panel3.add(add);
panel3.add(canel);
//将各个组件添加到窗体中
this.add(panel1, BorderLayout.WEST);
this.add(panel2, BorderLayout.CENTER);
this.add(panel3, BorderLayout.SOUTH);
//设置对话框属性
this.setSize(300, 200);
//设置对话框为可见
this.setVisible(true);
}
(3)修改学生界面文本框设计
JLabel id,name,sex,age,address,dep; //分别为学生学号,学生姓名,学生性别,学生年纪,学生籍贯,学生系别标签
JTextField jtf1, jtf2, jtf3, jtf4,jtf5, jtf6; //分别为学生学号,姓名,性别,年纪,籍贯,系列输入文本框
JButton update,canel; //分别为修改和取消按钮
Panel panel1 ,panel2, panel3;
public UpdateDatabase(Frame own, String title, boolean model, StModel stModel, int row)
{
super(own, title, model); //实现和父类窗口对话
//窗体西部组件
id = new JLabel("学号");
name = new JLabel("名字");
sex = new JLabel("性别");
age = new JLabel("年纪");
address = new JLabel("地址");
dep = new JLabel("系别");
//添加到panel1中
panel1 = new Panel(new GridLayout(6, 1));
panel1.add(id);
panel1.add(name);
panel1.add(sex);
panel1.add(age);
panel1.add(address);
panel1.add(dep);
//添加到窗体东部组件
jtf1 = new JTextField(10);
jtf1.setText((String)(stModel.getValueAt(row, 0)));
jtf1.setEditable(false);//设置学号不可修改
jtf2 = new JTextField(10);
jtf2.setText((String)(stModel.getValueAt(row, 1)));
jtf3 = new JTextField(10);
jtf3.setText((String)(stModel.getValueAt(row, 2)));
jtf4 = new JTextField(10);
jtf4.setText((String)(stModel.getValueAt(row, 3)));
jtf5 = new JTextField(10);
jtf5.setText((String)(stModel.getValueAt(row, 4)));
jtf6 = new JTextField(10);
jtf6.setText((String)(stModel.getValueAt(row, 5)));
//添加到第二个面板中
panel2 = new Panel(new GridLayout(6, 1));
panel2.add(jtf1);
panel2.add(jtf2);
panel2.add(jtf3);
panel2.add(jtf4);
panel2.add(jtf5);
panel2.add(jtf6);
//窗体南部组件
update = new JButton("确定");
canel = new JButton("取消");
panel3 = new Panel();
panel3.add(update);
panel3.add(canel);
//注册事件监听
update.addActionListener(this);
canel.addActionListener(this);
//添加组件到窗体中
this.add(panel1, BorderLayout.WEST);
this.add(panel2, BorderLayout.CENTER);
this.add(panel3, BorderLayout.SOUTH);
//设置窗体属性
this.setSize(300, 200);
//设置窗体为可见
this.setVisible(true);
}
3.2 用数据库建立学生信息表
(1)数据库建立学生表函数程序代码以下所表示:
create table st
(
stId varchar(30) primary key,
stNname varchar(50) not null,
stSex varchar(2) default'男',
stAge int,
stBorn varchar(30),
stDept varchar(30),
constraint stS check (stSex in ('男','女'))
);
(2)st表模型实现函数程序代码以下所表示:
public class StModel extends AbstractTableModel{
Vector<String> columNames = null; //表字段名称
Vector<Vector> rowDate = null; //表数据
//数据库
private Connection con = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
private final static String driver = "com.mysql.jdbc.Driver"; //加载jdbc驱动
private final static String url = "jdbc:mysql://localhost:3306/student"; //数据源
private final static String user = "root"; //数据库用户名
private final static String passWord = "root"; //数据库用户名密码
//对数据库进行查找
public void insertDatabase(String sql)
{
columNames = new Vector<String>(); //表字段名称
rowDate = new Vector<Vector>(); //表数据
columNames.add("学号");
columNames.add("名字");
columNames.add("性别");
columNames.add("年纪");
columNames.add("籍贯");
columNames.add("系别");
try
{
//加载jdbc驱动
Class.forName(driver);
//连接数据源
con = DriverManager.getConnection(url,user,passWord);
//实施sql
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next())
{
Vector<String> row = new Vector<String>();
row.add(rs.getString(1));
row.add(rs.getString(2));
row.add(rs.getString(3));
row.add(rs.getString(4));
row.add(rs.getString(5));
row.add(rs.getString(6));
rowDate.add(row); //将学生一条统计(row)添加到rowDate中
}
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
//关闭数据库资源
try
{
if(null != rs)
{
rs.close();
}
if(null != ps)
{
ps.close();
}
if(null != con)
{
con.close();
}
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}
//返回列数
public int getColumnCount() {
return this.columNames.size();
}
//返回表行数
public int getRowCount() {
return this.rowDate.size();
}
//得到某行某列数据
public Object getValueAt(int rowIndex, int columnIndex) {
return ((Vector)this.rowDate.get(rowIndex)).get(columnIndex);
}
//设置表字段名
public String getColumnName(int column)
{
return (String)this.columNames.get(column);
}
}
3.3 数据库连接
private final static String driver = "com.mysql.jdbc.Driver"; //加载jdbc驱动
private final static String url = "jdbc:mysql://localhost:3306/student"; //数据源
3.4 模块功效实现
主模块功效实现函数程序代码以下所表示:
public void actionPerformed(ActionEvent e)
{
//用户点击了查找按钮
if(e.getSource() == select)
{
String paras = textField.getText().trim();
stModel = new StModel();
stModel.insertDatabase("select * from st where stNname='"+paras+"'");
table.setModel(stModel);
}
//用户点击了添加按钮
else if(e.getSource() == insert)
{
InsertStudent insertStudent = new InsertStudent(this, "添加学生", true);
//刷新窗口表数据
stModel = new StModel();
stModel.insertDatabase("select * from st");
table.setModel(stModel);
}
//用户点击了修改按钮
else if(e.getSource() == update)
{
int row = this.table.getSelectedRow(); //用户选择行数
if(-1 == row) //假如用户没有选中行
{
JOptionPane.showMessageDialog(this, "请选择一行");
}
else
{
UpdateDatabase updateDatabase = new UpdateDatabase(this, "修改学生", true, stModel, row);
//刷新窗口表数据
stModel =new StModel();
stModel.insertDatabase("select * from st");
table.setModel(stModel);
}
}
//用户点击了删除按钮
else if(e.getSource() == delete)
{
//数据库
Connection con = null;
PreparedStatement ps = null;
String driver = "com.mysql.jdbc.Driver"; //jdbc驱动
String url = "jdbc:mysql://localhost:3306/student"; //数据源
String user = "root"; //数据库用户密码
String passWord = "root"; //数据库用户sa密码
int row = this.table.getSelectedRow(); //用户选择行
if(-1 == row) //用户没有选中行
{
JOptionPane.showMessageDialog(this, "请选择一行");
}
else
{
try
{
//加载jdbc驱动
Class.forName(driver);
//连接数据源
con = DriverManager.getConnection(url, user, passWord);
//实施sql
String sql = "delete from st where stId=?";
String id = (String)(stModel.getValueAt(row, 0)); //取得用户选择行学生学号
ps = con.prepareStatement(sql);
ps.setString(1, id);
ps.executeUpdate();
//刷新窗口
stModel = new StModel();
stModel.insertDatabase("select * from st");
table.setModel(stModel);
}
catch(ClassNotFoundException e1)
{
e1.printStackTrace();
}
catch(SQLException e1)
{
e1.printStackTrace();
}
finally
{
//关闭资源
try
{
展开阅读全文