1、 中北大学数据库原理课 程 设 计 说 明 书学生姓名 : 武大为学 号:11060342X37学生姓名 : 李力钊学 号:11060342X28学生姓名 : 周荣祥学 号:11060342X20学生姓名 : 南子锐学 号:11060342X44学 院 : 信 息 商 务 学 院专 业 : 计算机科学与技术 题 目 : 学生学籍管理系统指 导 教 师 武 瑞 娟2013 年 6 月 27 日1 设计目的:按照关系型数据库的基本原理,综合运用所学的知识,以小组为单位,设计开发一个小型的学生学籍管理系统。通过对一个实际问题的分析、设计与实现,将原理与应用相结合,使学生学会如何把书本上学到的知识用于
2、解决实际问题,培养学生的动手能力;另一方面,使学生能深入理解和灵活掌握教学内容。2 设计内容:设计内容:设计如下主要功能模块1) 实现学生基本情况的录入、修改、删除等基本操作。2) 对学生基本信息提供灵活的查询方式。3) 完成一个班级的学期选课功能。4) 实现学生成绩的录入、修改、删除等基本操作。5) 能方便的对学生的一个学期成绩进行查询。6) 具有成绩统计、排名等功能。7) 具有留级、休学等特殊情况的处理功能。8) 能输出常用的各种报表。9) 具有数据备份和数据恢复功能。设计要求:学生成绩表的设计,要考虑到不同年级的教学计划的变化情况。对于新生班级,应该首先进行基本情况录入、选课、然后才能进
3、行成绩录入。3功能模块详细设计3.1 详细设计思想这个学生管理系统,我们组用 Java 的 JDK1.6 开发工具和微软的 Microsoft SQL Server数据库两者相结合做出来的。一数据库的设计:1 创建数据库 StudentManager图 1.01.1 创建表:ClassInfo图 1.11.2 创建表:DepartmentInfo图 1.21.3 创建表:StudentInfo图 1.3二创建“数据源(ODBC) ”具体步骤:“开始”-“控制面板”-“管理工具”-“数据源(ODBC)-在用户 DNS 里,点“添加”-在数据源驱动列表最下方选择“SQLServer”-点“完成”-
4、出现了一个创建到 SQL Server 的新数据源-在数据源“名称”右侧,填写数据库的名称 ;在“服务器”右侧,写(local) -点“下一步”- 继续点“下一步 ”-在更改默认的数据库为“StudentManager” ,这里的数据库为我刚刚新建的数据库。-点“下一步”-点“完成”-出现一个“ODBC Microsoft SQL Server 安装”对话框-点击下面的“测试数据源”-出现图 2.1 就好了。图 2.1-下面依次点击“确定”就完成了。-完成了以后,你会在数据源里看到自己刚刚新建的数据源,名为:“StudentManager”图 2.23.2 核心代码:三代码的编写:3.1 数据
5、库连接类的代码(文件名:DBConnect.java )注意,这个文件最先编译,因为后面的几个文件的编译会用到该文件编译完产生的 DBConnect.class 文件/导入 sql 数据库包import java.sql.*;/创建数据库连接类public class DBConnect/静态方法提高数据库的连接效率public static Connection getConn() throws Exception/加载 JDBC 驱动Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“);/以系统默认用户身份,连接数据库 StudentManagerre
6、turn DriverManager.getConnection(“jdbc:odbc:StudentManager“,“,“);3.2 添加学生面板类的代码(文件名:AddStudentPanel.java)/导入系统的类包import java.awt.*;import java.sql.*;import javax.swing.*;import java.awt.event.*;/创建“添加学生面板”类public class AddStudentPanel extends JPanel implements ActionListener/声明连接数据库对象Connection con;
7、/声明 SQL 语句对象Statement st;/创建组件对象:标签、文本行、单选JLabel jLabel1=new JLabel(“学号“);JLabel jLabel2=new JLabel(“姓名“);JLabel jLabel3=new JLabel(“性别“);JLabel jLabel4=new JLabel(“出生日期“);JLabel jLabel5=new JLabel(“籍贯“);JLabel jLabel6=new JLabel(“注意:出生日期格式为 YYYY-MM-DD“);JTextField jTextField1=new JTextField();JText
8、Field jTextField2=new JTextField();JTextField jTextField3=new JTextField();JTextField jTextField4=new JTextField();JRadioButton jRadioButton1=new JRadioButton(“男“);JRadioButton jRadioButton2=new JRadioButton(“女“);ButtonGroup buttonGroup1=new ButtonGroup();JButton jButton1=new JButton(“存入数据库“);/构造方法p
9、ublic AddStudentPanel()try/调用初始化方法jbInit();catch(Exception exception)exception.printStackTrace();/界面初始化方法private void jbInit() throws Exception/连接数据库con=DBConnect.getConn();/创建一个 statement 对象来将 SQL 语句发送到数据库st=con.createStatement();/框架的布局this.setLayout(null);/设置各组件的大小jLabel1.setBounds(new Rectangle(2
10、1,17,64,24);jLabel2.setBounds(new Rectangle(21,51,53,22);jLabel3.setBounds(new Rectangle(21,86,61,27);jLabel4.setBounds(new Rectangle(21,122,59,25);jLabel5.setBounds(new Rectangle(21,188,54,24);jLabel6.setBounds(new Rectangle(102,153,219,27);jTextField1.setBounds(new Rectangle(102,10,200,30);jTextFi
11、eld2.setBounds(new Rectangle(102,49,200,30);jTextField3.setBounds(new Rectangle(102,117,200,33);jTextField4.setBounds(new Rectangle(102,183,200,29);jRadioButton1.setBounds(new Rectangle(102,83,65,30);jRadioButton2.setBounds(new Rectangle(190,85,85,30);jButton1.setBounds(new Rectangle(103,217,180,30)
12、;/设置单选按钮被选中jRadioButton1.setSelected(true);/添加按钮动作事件jButton1.addActionListener(this);/添加组件到面板this.add(jTextField1);this.add(jLabel1);this.add(jLabel2);this.add(jTextField2);this.add(jRadioButton1);this.add(jRadioButton2);this.add(jLabel3);this.add(jLabel4);this.add(jTextField3);this.add(jLabel6);thi
13、s.add(jTextField4);this.add(jLabel5);this.add(jButton1);buttonGroup1.add(jRadioButton1);buttonGroup1.add(jRadioButton2);/点击按钮事件/事件相应器 当你定义的事件捕捉以后就会执行这个里面的代码public void actionPerformed(ActionEvent e)/获取用户输入的信息String xuehao=jTextField1.getText();String xingming=jTextField2.getText();String xingbie=“;i
14、f(jRadioButton1.isSelected()xingbie+=“男“;if(jRadioButton2.isSelected()xingbie+=“女“;String dateString=jTextField3.getText();String jiguan=jTextField4.getText();try/设置日期格式st.execute(“set dateformat ymd“);/利用 st 对象执行 SQL 语句,进行插入操作st.executeUpdate(“insert into StudentInfo values(“+xuehao+“,“+xingming+“,
15、“+xingbie+“,“+dateString+“,“+jiguan+“,“+xuehao.substring(4,6)+“,“+xuehao.substring(0,6)+“)“);/清空文本行的内容jTextField1.setText(“);jTextField2.setText(“);jTextField3.setText(“);jTextField4.setText(“);/利用消息对话框提示删除操作成功JOptionPane.showMessageDialog(this,“插入成功!“);catch(Exception ex)/利用消息对话框提示不能插入,并显示异常的信息JOpt
16、ionPane.showMessageDialog(this,“输入数据错误或者数据库不允许插入!“);ex.printStackTrace();3.3 删除学生面板类的代码(文件名:DeleteStudentPanel.java)/导入系统的类包import java.awt.*;import java.sql.*;import javax.swing.*;import java.awt.event.*;/创建“删除学生面板”类public class DeleteStudentPanel extends JPanel implements ActionListener/声明连接数据库对象C
17、onnection con;/声明 SQL 语句对象Statement st;/创建组件对象JLabel jLabel1=new JLabel(“请输入待删除的学生的学号: “);JTextField jTextField1=new JTextField();JButton jButton1=new JButton(“删除“);/构造方法public DeleteStudentPanel()try/调用初始化方法jbInit();catch(Exception exception)exception.printStackTrace();/界面初始化方法private void jbInit()
18、 throws Exception/连接数据库con=DBConnect.getConn();st=con.createStatement();/框架的布局this.setLayout(null);/设置各组件的大小jLabel1.setFont(new java.awt.Font(“宋体“,Font.BOLD,14);jLabel1.setBounds(new Rectangle(70,20,200,30);jTextField1.setBounds(new Rectangle(70,80,207,41);jButton1.setBounds(new Rectangle(70,175,205
19、,36);/添加按钮动作事件jButton1.addActionListener(this);/添加组件到面板this.add(jLabel1);this.add(jTextField1);this.add(jButton1);/点击按钮事件public void actionPerformed(ActionEvent e)/获取用户输入的学号String xuehao=jTextField1.getText();/要求用户确认删除if(JOptionPane.showConfirmDialog(this,“确认要删除吗? “)=JOptionPane.YES_OPTION)try/利用 st
20、 对象执行 SQL 删除操作st.executeUpdate(“delete from StudentInfo where 学号=“+xuehao+“);/利用消息对话框提示删除操作成功JOptionPane.showMessageDialog(this,“删除操作成功!“);/清空输入学号的文本行jTextField1.setText(“);catch(Exception ex)/利用消息对话框提示不能删除JOptionPane.showMessageDialog(this,“删除操作执行失败!“);3.4 按姓名查询学生面板类的代码(文件名:InquireOnNamePanel.java)
21、/导入系统的类包import java.awt.*;import java.sql.*;import javax.swing.*;import java.awt.event.*;/创建“添加学生面板”类public class InquireOnNamePanel extends JPanel implements ActionListener/声明连接数据库对象Connection con;/声明 SQL 语句对象Statement st;/创建组件对象:标签、文本行、单选JLabel jLabel1=new JLabel(“请输入待查询的学生的姓名: “);JTextField jText
22、Field1=new JTextField();JButton jButton1=new JButton(“按姓名查询“);JScrollPane jScrollPane1=new JScrollPane();JTextArea jTextArea1=new JTextArea();/构造方法public InquireOnNamePanel()try/调用初始化方法jbInit();catch(Exception exception)exception.printStackTrace();/面板初始化方法private void jbInit() throws Exception/连接数据库
23、con=DBConnect.getConn();st=con.createStatement();/框架的布局this.setLayout(null);/设置各组件的大小jLabel1.setFont(new java.awt.Font(“宋体“,Font.BOLD,14);jLabel1.setBounds(new Rectangle(80,10,200,34);jTextField1.setBounds(new Rectangle(80,50,200,30);jButton1.setBounds(new Rectangle(100,90,160,30);jScrollPane1.setBo
24、unds(new Rectangle(29,125,308,130);/添加按钮动作事件jButton1.addActionListener(this);/添加组件到面板this.add(jScrollPane1);jScrollPane1.getViewport().add(jTextArea1);this.add(jLabel1);this.add(jTextField1);this.add(jButton1);/点击按钮事件public void actionPerformed(ActionEvent e)/获取用户输入的姓名String xingming=jTextField1.get
25、Text();/清空文本区原有的内容jTextArea1.setText(“);/要求用户确认删除try/利用 st 对象执行 SQL 语句,返回结果集对象ResultSet rs=st.executeQuery(“select * from StudentInfo where 姓名=“+xingming+“);/处理结果集:逐条显示结果集中的记录while(rs.next()jTextArea1.append(rs.getString(“学号“)+“ “+rs.getString(“姓名“)+“ “+rs.getString(“性别“)+“ “+rs.getDate(“出生日期“)+“ “+
26、rs.getString(“籍贯“)+“n“); catch(Exception ex)/利用消息对话框提示查询失败JOptionPane.showMessageDialog(this,“查询失败!“);/清空文本行的内容jTextField1.setText(“);3.5 按学号查询学生面板类的代码(文件名:InquireOnXHPanel.java)/导入系统的类包import java.awt.*;import java.sql.*;import javax.swing.*;import java.awt.event.*;/创建“添加学生面板”类public class InquireO
27、nXHPanel extends JPanel implements ActionListener/声明连接数据库对象Connection con;/声明 SQL 语句对象Statement st;/创建组件对象:标签、文本行、单选JLabel jLabel1=new JLabel(“请输入待查询的学生的学号: “);JTextField jTextField1=new JTextField();JButton jButton1=new JButton(“按学号查询“);JTextArea jTextArea1=new JTextArea();/构造方法public InquireOnXHPa
28、nel()try/调用初始化方法jbInit();catch(Exception exception)exception.printStackTrace();/面板初始化方法private void jbInit() throws Exception/连接数据库con=DBConnect.getConn();st=con.createStatement();/框架的布局this.setLayout(null);/设置各组件的大小jLabel1.setFont(new java.awt.Font(“宋体“,Font.BOLD,16);jLabel1.setBounds(new Rectangle
29、(46,4,222,32);jTextField1.setBounds(new Rectangle(47,37,247,31);jButton1.setBounds(new Rectangle(47,86,247,30);jTextArea1.setBounds(new Rectangle(24,130,305,109);/添加按钮动作事件jButton1.addActionListener(this);/添加组件到面板this.add(jLabel1);this.add(jTextField1);this.add(jTextArea1);this.add(jButton1);/点击按钮事件p
30、ublic void actionPerformed(ActionEvent e)/获取用户输入的学号String xuehao=jTextField1.getText();/清空文本区原有的内容jTextArea1.setText(“);try/利用 st 对象执行 SQL 语句,返回结果集对象ResultSet rs=st.executeQuery(“select * from StudentInfo where 学号=“+xuehao+“);/处理结果集:逐条显示结果集中的记录/此处没有使用 while,因为学号是唯一的,而姓名不是,所以在InquireOnNamePanel.java
31、里使用了 whileif(rs.next()jTextArea1.setText(rs.getString(“学号“)+“ “+rs.getString(“姓名“)+“ “+rs.getString(“性别“)+“ “+rs.getDate(“出生日期“)+“ “+rs.getString(“籍贯“)+“n“);elseJOptionPane.showMessageDialog(this,“没有这个学号!“);catch(Exception ex)/利用消息对话框提示查询失败JOptionPane.showMessageDialog(this,“查询失败!“);/清空文本行的内容jTextFi
32、eld1.setText(“);3.6 系统主界面类的代码(文件名:MainFrame.java)/导入系统的包import java.awt.*;import java.awt.event.*;import javax.swing.*;/创建主界面类public class MainFrame extends JFrame implements ActionListener/创建内容面板JPanel contentPane;/创建菜单栏(见 267 页的图 12.1 里的菜单栏)JMenuBar jMenuBar1=new JMenuBar();JMenu jMenuFile=new JMe
33、nu(“文件“);JMenuItem jMenuFileExit=new JMenuItem(“退出“);JMenu jMenu1=new JMenu(“学生管理“);JMenuItem jMenuItem1=new JMenuItem(“添加学生“);JMenuItem jMenuItem2=new JMenuItem(“删除学生“);JMenu jMenu2=new JMenu(“学生查询“);JMenuItem jMenuItem3=new JMenuItem(“按姓名查询“);JMenuItem jMenuItem4=new JMenuItem(“按学号查询“);/创建标签,用于显示信
34、息JLabel jLabel1=new JLabel(“欢迎使用学生信息管理系统 “);JLabel jLabel2=new JLabel(“2013 年 6 月 24 日计 2 第七组 “);/构造方法,创建对象时自动调用public MainFrame()try/关闭框架窗口时的默认事件方法setDefaultCloseOperation(EXIT_ON_CLOSE);/调用初始化方法jbInit();catch(Exception exception)exception.printStackTrace();/界面初始化方法private void jbInit() throws Exce
35、ption/创建内容面板和其布局contentPane =(JPanel) getContentPane();contentPane.setLayout(null);/框架的大小和其标题setSize(new Dimension(400,320);setTitle(“学生信息管理系统“);/添加事件监听器jMenuFileExit.addActionListener(this);jMenuItem1.addActionListener(this);jMenuItem2.addActionListener(this);jMenuItem3.addActionListener(this);jMen
36、uItem4.addActionListener(this);/添加菜单条setJMenuBar(jMenuBar1);/添加菜单组件到菜单条jMenuBar1.add(jMenuFile);jMenuBar1.add(jMenu1);jMenuBar1.add(jMenu2);jMenuBar1.add(jMenuFileExit);/添加菜单项组件到菜单组件jMenuFile.add(jMenuFileExit);jMenu1.add(jMenuItem1);jMenu1.add(jMenuItem2);jMenu2.add(jMenuItem3);jMenu2.add(jMenuItem
37、4);/添加标签到内容面板contentPane.add(jLabel1);contentPane.add(jLabel2);/设置标签组件的大小和字体jLabel1.setFont(new java.awt.Font(“宋体“,Font.BOLD,20);jLabel1.setBounds(new Rectangle(65,70,275,55);jLabel2.setFont(new java.awt.Font(“宋体“,Font.BOLD,16);jLabel2.setBounds(new Rectangle(90,150,200,35);/菜单事件的处理方法public void act
38、ionPerformed(ActionEvent actionEvent)/点击“文件”菜单下的“退出”菜单项if(actionEvent.getSource()=jMenuFileExit)System.exit(0);/点击“学生管理”菜单下的“添加学生”菜单项if(actionEvent.getSource()=jMenuItem1)/创建添加学生面板对象AddStudentPanel add=new AddStudentPanel();/移除主界面上原有的内容this.remove(this.getContentPane();this.setContentPane(add);/令界面可
39、见this.setVisible(true);/点击“学生管理”菜单下的“删除学生”菜单项if(actionEvent.getSource()=jMenuItem2)/创建删除学生面板对象DeleteStudentPanel delete=new DeleteStudentPanel();/移除主界面上原有的内容this.remove(this.getContentPane();this.setContentPane(delete);/令界面可见this.setVisible(true);/点击“学生查询”菜单下的“按姓名查询”菜单项if(actionEvent.getSource()=jMe
40、nuItem3)/创建“按姓名查询”面板对象InquireOnNamePanel onName=new InquireOnNamePanel();/移除主界面上原有的内容this.remove(this.getContentPane();this.setContentPane(onName);/令界面可见this.setVisible(true);/点击“学生查询”菜单下的“按学号查询”菜单项if(actionEvent.getSource()=jMenuItem4)/创建“按学号查询”面板对象InquireOnXHPanel onXH=new InquireOnXHPanel();/移除主界
41、面上原有的内容this.remove(this.getContentPane();this.setContentPane(onXH);/令界面可见this.setVisible(true);3.7 系统的主程序类的代码(文件名:Main.java )/导入包import java.awt.*;import javax.swing.*;/创建主系统类class Mainpublic static void main (String args)/创建主界面MainFrame frame=new MainFrame();/获取屏幕尺寸Dimension screenSize=Toolkit.getD
42、efaultToolkit().getScreenSize();/获取主界面的窗体尺寸Dimension frameSize =frame.getSize();/令主界面窗体居中if(frameSize.heightscreenSize.height)frameSize.height=screenSize.height;if(frameSize.widthscreenSize.width)frameSize.width=screenSize.width;frame.setLocation(screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);/令主界面显示frame.setVisible(true);图 3.1图 3.2图 3.3图 3.4