利用计算机进行学生信息管理,不仅能够保证准确、无误、快速输出,而且还可以利用计算机对有关信息进行查询,检索迅速、查找方便、可靠性高、存储量大、保密性好。要科学地实现信息化管理,开发一个适合学校的,能够进行信息存储、查询、修改等功能的信息管理系统是十分重要的。我这次的课题就是设计与实现一个学生信息管理系统。
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 系统功能模块关系图
根据功能的需要,我设想了主窗口界面的大体布置图,并在设计与实现的过程中尽量去按照设想图的图样去实现。设想图如下图所示,图中也大概地标明了部分标语与说明。
图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 Vector //数据库 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 rowDate = new 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 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 { if(null != ps) { ps.close(); } if(null != con) { con.close(); } } catch(SQLException e1) { e1.printStackTrace(); } } } } } 子模块功能的实现: (1)添加文本框功能的实现函数程序代码如下: public class InsertStudent extends JDialog implements ActionListener{ 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); } public void actionPerformed(ActionEvent e) { //数据库 Connection con = null; PreparedStatement ps = null; boolean result = true; //记录添加学生是否成功 if(e.getSource() == add) { try { //加载jdbc驱动 Class.forName("com.mysql.jdbc.Driver"); //连接数据源 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "root"); //执行sql String sql = "insert into st values(?,?,?,?,?,?)"; ps = con.prepareStatement(sql); ps.setString(1, jtf1.getText()); ps.setString(2, jtf2.getText()); ps.setString(3, jtf3.getText()); ps.setString(4, jtf4.getText()); ps.setString(5, jtf5.getText()); ps.setString(6, jtf6.getText()); ps.executeUpdate(); //关闭对话框 this.dispose(); } catch(ClassNotFoundException e1) { result = false; //添加学生记录失败 e1.printStackTrace(); } catch(SQLException e1) { result = false; //添加学生记录失败 e1.printStackTrace(); } finally { //关闭资源 try { if(null != ps) { ps.close(); } if(null != con) { con.close(); } } catch(SQLException e1) { e1.printStackTrace(); } } if(false == result) { JOptionPane.showMessageDialog(this, "失败信息:学号不能重复,性别只能为'男'或者'女',年龄大于0"); } } else if(e.getSource() == canel) { //关闭对话框 this.dispose(); } } } (2)修改文本框功能的实现函数程序代码如下所示: public class UpdateDatabase extends JDialog implements ActionListener{ 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); } //响应用户操作 public void actionPerformed(ActionEvent e) { //数据库 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"; //数据库的用户密码 boolean result = true; //记录修改学生是否成功 if(e.getSource() == update) { try { //加载jdbc驱动 Class.forName(driver); //连接数据源 con = DriverManager.getConnection(url,user,passWord); //执行sql String sql = "update st set stNname=?, stSex=?,stAge=?,stBorn=?,stDept=? where stId=? "; ps = con.prepareStatement(sql); //修改学生数据 ps.setString(1, jtf2.getText()); ps.setString(2, jtf3.getText()); ps.setString(3, jtf4.getText()); ps.setString(4, jtf5.getText()); ps.setString(5, jtf6.getText()); ps.setString(6, jtf1.getText()); ps.executeUpdate(); //关闭对话框 this.dispose(); } catch(ClassNotFoundException e1) { result = false; e1.printStackTrace(); } catch(SQLException e1) { result = false; e1.printStackTrace(); } finally { //关闭资源 try { if(null != ps) { ps.close(); } if(null != con) { con.close(); } } catch(SQLException e1) { e1.printStackTrace(); } if(false == result) { JOptionPane.showMessageDialog(this, "失败信息:学号不能重复,性别只能为'男'或者'女',年龄大于0"); } } } else if(e.getSource() == canel) { this.dispose();//关闭对话框 } } } 4 调试分析 4.1 系统功能测试 功能测试主要是测试程序模块是否实现了设计中所要求的功能。功能测试中需要注意的有: (1)查询功能中,是按学生姓名查询的,其他的输入是没有结果的。 (2)添加功能中,需要注意的是前台设置的数值长度是否大于后台数值长度,以及前台和后台的数据结构是否相符,很多时候录入功能无法实现是由于这些原因。还有就是必须录入的字段的设置时候有误。 (3)删除功能中,需要点中你要删除信息的所在行,再点删除,才能删除。 (4)修改功能中,主要是看修改确认后是否数据真正已被修改了。这是最基本的功能,需要注意的是看是否能把不应该修改的数据也修改成功了。 4.2 系统调试常见错误 (1)SQLException异常 一般是由于SQL语句不正确引起的。为避免这种异常,最好在使用SQL语句的程序中捕获此SQL异常。 (2) ClassNotFoundException异常 这是由于没找到相关类而引起的。为了避免这种异常,最好要能清楚的知道有多少个类,都保证所有类存在且能正常使用。 4.3 实验小结 通过这次课题的设计与实现,让我获得了更多的经验、心得和锻炼。在做课题的过程中,我遇到很多难题,但最后都经过同学的帮助和从网络、书本中找到了解决方法。虽然课题的设计与实现的过程比较艰难,但我还是很满意的,因为在这过程中我得到了实验成功的快乐,也学到了许多新知识。并且经过这次课程设计,让我所学的知识得到一个好的总结,编程能力也有所提高。在本课题的设计中,会因为能力和相关专业知识的有限,难免有不足之处,我会在以后的加强学习中改进。 5 用户使用说明 1、本课题程序支持多种系统平台(HPUX、SUNOS、OSF/1、VMS、 WINDOWS、WINDOWS/NT、OS/2),运行软件为:eclipse,数据库为:mysql。 2、运行程序后,程序会生成可使用软件,可根据软件主窗口的显示界面,点击用户需要执行操作。 (1)当用户需要添加学生信息时,用户先点击主窗口界面的添加,会弹出一个添加学生信息的文本框,用户只需在文本框标题提示的位置输入要添加的学生信息,输入信息后点击添加(点击取消,就会取消本次信息添加,并推出添加文本框),用户所输入的学生信息就会被存入数据库。 (2)当用户需要查询学生信息时,只需在软件主窗口界面的标题“学生名”处,输入用户需要查询的学生姓名,然后点击查询,用户查询的学生的信息就会显示在主窗口界面的中间位置。 3)当用户需要删除学生信息时,只需找到要删除的学生信息,然后用鼠标点中要删除学生信息所在行,再点击主窗口界面上的删除,就可以将用户选中的学生信息从数据库中删除掉。 4)当用户需要修改学生信息时,用户需要先找到要修改的学生信息,然后用鼠标点中要修改的学生信息所在行,再点击主窗口界面的修改,会弹出一个修改学生信息的文本框,用户只需在文本框标题提示的位置输入要修改的学生信息,输入信息后点击确认(点击取消,就会取消本次信息修改,并推出修改文本框),用户所输入的学生信息就会被存入数据库。 6 测试数据和数据结果 程序运行后生成可用软件,软件的主窗口界面如下图所示(已预先输入部分学生信息): (1)当在“学生名”处输入:文艺,再点击查询。输出结果如下所示: (2)在主窗口界面处点击添加,弹出添加文本框如下: 依次输入添加信息: 200906 龙一 男 21 广东 电气 得结果如下图所示: (3)在“学生名”处输入:张三,点击查询,得结果如下图所示: 然后用鼠标点击主窗口界面中间位置的学生张三的信息所在行,再点击主窗口界面上的删除,得结果如下图所示: (4) 在“学生名”处输入:李四,点击查询,得结果如下图所示: 然后用鼠标点击主窗口界面中间位置的学生李四的信息所在行,再点击主窗口界面上的修改,弹出一个修改该学生的文本框,如下图所示: 分别在修改学生信息的文本框中的性别和地址处,依次修改信息为:男 、,修改信息后,点击文本框的确认,得结果如下图所示: 参考文献 [1] 印旻.Java与面向对象程序设计教程.北京:清华大学出版社,1999.11 [2] 宛延闿.Java程序设计实例剖析.北京:国防工业出版社,2003.03 [3] 周晓聪.面向对象程序设计与Java语言.北京:机械工业出版社,2004.03 [4] 王克宏、郝建文. Java技术教程. 北京:清华大学出版社,2002.9月 附件 学生信息管理系统源程序清单: //StuMange.java程序清单 package keshe; import java.awt.BorderLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; public class StuMange extends JFrame implements ActionListener{ 定义用户界面用到的组件 要查询的学生的名字 用户输入的文本框 JButton select = null; //查询按钮 JButton insert = null; //添加按钮 JButton update = null; //修改按钮 删除按钮 JTable table = null; //用于显示数据库调出的数据的表 Panel panel1 = null; 表的模型 窗口显示的上部的组件 学生名:"); textField = new JTextField(10); //用户输入文本框限定为最多输入10个字符 查询"查询按钮 添加到第一个面板中 窗口下部的组件 添加"); 删除"); 修改"); 添加到第三个个面板中 窗口中部的组件 注册事件监听 将各个组件添加到窗体中 设置窗体属性 设置窗口大小 设置窗口显示的位置 学生信息管理系统"); //设置窗口标题 设置窗口关闭之后其后台程序同时关闭 设置窗口为可见 用户点击了查找按钮 } 用户点击了添加按钮 添加学生", true); 刷新窗口表的数据 用户点击了修改按钮 用户选择的行数 如果用户没有选中行 请选择一行"); 修改学生", true, stModel, row); 刷新窗口表的数据 } 用户点击了删除按钮 数据库 驱动 数据源 数据库用户密码 数据库用户sa的密码 用户选择的行 if(-1 == row) //用户没有选中行 请选择一行"); 加载jdbc驱动 连接数据源 执行sql 获得用户选择的行的学生的学号 刷新窗口 关闭资源 } //------------------------------------------------------------------------------------------------ //StModel.java源程序清单 package keshe; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; import javax.swing.table.AbstractTableModel; public class StModel extends AbstractTableModel{ 表的字段名称 表的数据 数据库 private final static String driver = "com.mysql.jdbc.Driver"; //加载的jdbc驱动 数据源 数据库的用户名 private final static String passWord = "root"; //数据库的用户名的密码 对数据库进行查找 表的字段名称 表的数据 学号"); 名字"); 性别"); 年龄"); 籍贯"); 系别"); 加载jdbc驱动 连接数据源 执行sql { 将学生的一条记录(row)添加到rowDate中 } 关闭数据库资源 返回列数 返回表的行数 得到某行某列的数据 设置表的字段名 } //--------------------------------------------------------------------------------------------------------- //Mannager.java源程序清单 package keshe; public class Mannager { public static void main(String[] agrgs){ StuMange sm = new StuMange(); } } //----------------------------------------------------------------------------------------------------------- //InsertStudent.java源程序清单 package keshe; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; public class InsertStudent extends JDialog implements ActionListener{ 分别代表学生的学号,名字,性别,年龄,籍贯,系别 用户输入的文本框,分别为学生的学号,名字,性别,年龄,籍贯,系别 分别为添加按钮和取消按钮 实现与父类窗口对话 我执行了"); 窗体的西部的组件 学号:"); 姓名:"); 性别"); 年龄"); 籍贯"); 系别:"); 添加到panel1面板中 窗体的东部组件 添加到第二个面板中 窗体北部的控件 添加"); 取消"); 注册事件监听 添加到panel3面板中 将各个组件添加到窗体中 设置对话框属性 设置对话框为可见 数据库 记录添加学生是否成功 加载jdbc驱动 连接数据源 执行sql 关闭对话框 添加学生记录失败 result = false; //添加学生记录失败 关闭资源 } } 失败信息:学号不能重复,性别只能为'男'或者'女',年龄大于0"); 关闭对话框 } //--------------------------------------------------------------------------------------------------------- //UpdateDatabase.java源程序清单 package keshe; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; public class UpdateDatabase extends JDialog implements ActionListener{ 分别为学生的学号,学生的姓名,学生的性别,学生的年龄,学生的籍贯,学生的系别的标签 分别为学生的学号,姓名,性别,年龄,籍贯,系列的输入文本框 分别为修改和取消按钮 实现与父类窗口对话 窗体西部的组件 学号"); 名字"); 性别"); 年龄"); 地址"); 系别"); 添加到panel1中 添加到窗体的东部的组件 设置学号不可修改 添加到第二个面板中 窗体南部的组件 确认"); 取消"); 注册事件监听 添加组件到窗体中 设置窗体属性 设置窗体为可见 响应用户操作 数据库 驱动 连接数据源 数据库的用户 数据库的用户密码 boolean result = true; //记录修改学生是否成功 加载jdbc驱动 连接数据源 执行sql 修改学生数据 关闭对话框 关闭资源 失败信息:学号不能重复,性别只能为'男'或者'女',年龄大于0"); 关闭对话框 } //----------------------------------------------------------------------------------------------------------------------------- //建表源程序清单 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 ('男','女')) );