基于java所写的学生选课管理系统

一、概述

 

  1. 项目背景

 

随着学校的规模不断扩大,学生数量急剧增加;面对庞大的信息量需要有一个学生管理系统来提高学生管理工作的效率。通过学生选课管理信息系统可以做到信息的规范管理、科学统计和快速査询、修改、增加、删除等,从而实现管理方面的工作量。目前社会上信息管理系统发展飞快,各个企业单位都引入了信息管理软件来管理自己日益增长的各种信息,学生管理系统也有了很大的发展,商业化的管理软件也是日益增多。本学生系统完全独立开发,力求系统功能简明、操作界面简单、易于操作。

 

 

  1. 编写目的

 

   学生信息管理系统是一个教育单位不可缺少的部分。简单易用的信管理系统不但能有效地减轻学校相员的工作负担,它的內容对于学校的决策者和管理者来说都至关重要。所以学生信息管理系统应该能够为用户提供充足的信息和快捷的査询手段。本系统是将现代化的计算机应用技术与教务工作相结合,按照正常的工作流程设计完成,为使系统在管理中发挥更大的作用,提高工作效率和工作质量。

 

 

  1. 软件定义

 

该软件允许三种身份登录,分别是学生、教师、管理员,各自拥有不同的权限。学生可以查询个人信息、在选课的时间进行选课、查看考试成绩、查看可选课程和所属学院;教师可以查看个人信息、开课课程、选择自己课程学生的部分信息、录入学生成绩;管理员除了录入学生成绩之外,其余的功能几乎都可以实现,譬如增加、修改学生信息;以及对数据进行报表功能等等。

 

 

  1. 开发环境等内容

 

整个系统的研究、设计与实施基于 Window开发平台,后台使用Sql Server 2012数据库,数据源方式选的是OJBC,开发语言是Java语言,开发工具选用的是Eclipse,系统界面采用的是WinForm。

 

 

二、需求分析

 

 

  1. 数据信息要求

 

数据库的数据需求是根据用户的需求与设计者对用户者的需求进行分析所得,以下是学生信息管理系统的数据需求分析:

(1)学生信息表(student)

学号sno:char(9)

姓名sname:nvarchar(8)

性别ssex:nchar(1)    男 或 女

年龄sage:int(4)     14≤sage≤24

系别sdept:nvarchar(30)

(2)课程信息表(course)

课程号cno:char(6)

课程名cname:nvarchar(50)

先行课编号cpno:char(6)

学分ccredit:smallint(2)

(3)教师信息表(teacher)

教工号tno:char(8)

姓名tname:nvarchar(8)

性别tsex:nchar(1)    男 或 女

年龄tage:int(4)     24≤sage≤60

学历teb:nvarchar(10)    学士、硕士、博士

职称tpt:nvarchar(10)    助教、讲师、副教授、教授

主讲课程一cno1: char(6)

主讲课程二cno2: char(6)

主讲课程三cno3: char(6)

(4)院系信息表(department)

系编号dno:char(3)

系名dname:varchar(30)

系主任dmanager:char(8)

(5)选课信息表(sct)

学号sno:char(9)

课程号cno:char(6)

教工号tno:char(8)

成绩grade:int(4)

 

 

 

 

  1. 功能处理要求

 

(1) 用户及权限管理。提供用户管理、权限分配、登录权限验证功能,包括:

  1. 管理员增加、修改、删除用户;
  2. 管理员对用户角色进行权限分配
  3. 用户登录及权限分配
  4. 管理员更改用户密码

 

(2) 学生基本信息管理。提供学生基本信息的录入、维护、报表与查询功能,包括:

          1. 管理员根据学校教务处学生名单录入学生的基本信息
          2. 管理员根据学生本人可修改学生的基本信息
          3. 管理员增加、删除学生基本信息
          4. 管理员可查询学生基本信息,任课教师可查询上课学生的基本信息,学生可以查看个人档案信息。

 

(3) 教师基本信息管理。提供教师基本信息的录入、维护、报表与查询功能,包括:

          1. 管理员根据学校教务处教师名单录入教师的基本信息
          2. 管理员根据教师本人可修改教师的基本信息
          3. 管理员增加、删除教师基本信息
          4. 管理员可查询教师基本信息,教师可以查看个人档案信息

 

(4)学院基本信息管理。提供学院基本信息的录入、维护、报表与查询功能,包括:

  1. 管理员录入学院的基本信息
  2. 管理员修改、增加以及删除学院的基本信息
  3. 所有用户可根据学院名称查询学院的基本信息

 

(5)课程基本信息管理。提供课程基本信息的录入、维护、报表与查询功能,包括:

  1. 管理员根据教务处所给课程资料录入课程基本信息;
  2. 管理员修改、增加以及删除课程的基本信息;
  3. 所有用户可根据课程名称或者课程号查询课程的基本信息

 

(6)学生选课管理:提供在规定时间选课功能:

  1. 学生选课:学生可以根据已开课程进行选课
  2. 冲突检查:自动检查学生选课冲突
  3. 课表查询:自动检查学生选课冲突

 

(7)学生成绩管理。提供老师对学生考试成绩的录入、修改以及查询功能,包括:

  1. 学生成绩查询:学生可查询本人全部课程的考试成绩及学分情况;教师可根据学生学号查询某学生或查询某课程所有学生的考试成绩。
  2. 学生成绩录入:任课老师可在考试结束后录入学生选择这门课程的成绩。

 

 

 

 

 

图1.1   学生信息管理系统功能模块

 

 

 

 

 

 

 

  1. 安全性与完整性要求

 

(1)  每个用户分配特定的用户试图,对应其应有的访问权限

  1. 一所大学由多个学院组成,一个学生只能属于一个学院
  2. 每个学生可选修多个课程,学生年龄在14~2之间,任课教师需要记录学生选修课程的成绩;成绩只能在0~100分之间

(4)  用户只能在适合他们完成工作需要的窗口中看到需要的数据

 

 

 

 

 

 

 

三、概念结构设计

 

  1. 实体集

 

  1. 学生实体集:具有学号、姓名、性别、年龄、学院等属性,学生与学院具有多对一的关系。

 

图3.1   学生实体集

 

  1. 教师实体集:具有教师编号、教师名、性别、年龄、职称、学历、主讲课程1、主讲课程2、主讲课程3,教师与学院之间存在多对一的关系。

 

图3.2  教师实体集

  1. 课程实体集:具有课程号、课程名称、学分、先行课程等属性,其ER图如下:

图3.3  课程实体集

  1. 学院实体集:具有学院编号、学院姓名、系主任属性。

图3.4  学院实体集

 

 

  1. 选课实体集:学号

图3.5  选课实体集

 

 

2、完整的ER图

 

         图3.6  完整ER图

 

 

 

 

 

 

 

 

 

 

 

 

四、逻辑结构设计

 

  1. 由实体集转化的关系模式

 

  1. 学生实体集转化而来的关系模式如下,属性的定义如下图:

student(sno,sname,ssex,sage,sdept)

            图4-1 学生表

属性名

数据类型

属性描述

sno

char(9)

学号

sname

nvarchar(8)

姓名

ssex

nchar(1)

性别

sage

int

年龄

sdept

varchar(30)

学院

 

  1. 教师实体集转化而来的关系模式如下,属性的定义如下图:

teacher(tno,tname,tsex,tage,teb,tpt,cno1cno2cno3)

             图4-2 教师表

属性名

数据类型

属性描述

tno

char(8)

教工号

tname

nvarchar(8)

教工姓名

tsex

nchar(1)

性别

tage

int

年龄

teb

nvarchar(10)

学历

tpt

nvarchar(10)

职称

cno1

char(6)

主讲课程1

cno2

char(6)

主讲课程2

cno3

char(6)

主讲课程3

 

 

  1. 课程实体集转化而来的关系模式如下,属性的定义如下图:

course(cno,cname,cpno,ccredit)

          图4-3 课程表

属性名

数据类型

属性描述

cno

char(6)

课程号

cname

nvarchar(50)

课程名

cpno

char(6)

先行课程

ccredit

smallint

学分

 

 

  1. 学院实体集转化而来的关系模式如下,属性的定义如下图:

department(dno,dname,dmanager)

            图4-4 院系表

属性名

数据类型

属性描述

dno

char(3)

系编号

dname

varchar(30)

系名

dmanager

char(8)

系主任

 

 

 

 

  1. 由联系集转化而来的关系模式

 

 

选课联系集转化的关系模式如下,属性定义如下图所示:

XuanKe(snocnotno,grade)

            图4-5 选课表

属性名

数据类型

属性描述

sno

char(9)

学号

cno

char(6)

课程号

tno

char(8)

教工号

grade

int

成绩

 

 

  1. 各个表之间形成的数据库关系图:

           图4.1 关系图

 

 

 

 

 

 

五、主要模块的设计以及代码

 

  1. 主要模块设计思路

 

  1. 登录界面设计思路

图5-1 登录界面

关键代码:

public Start() {      //构造函数

                     init();        //初始化界面函数

                     }

              public static void main(String[] args) {

                     Start ssc = new Start();         //开启运行程序

                     }

          @Override

              public void actionPerformed(ActionEvent e) {

                     String username = text1.getText().trim();    //用户名输入文本框

                     String password = text2.getText().trim();     //密码输入文本框

                                          if (e.getSource() == Button1) {

                                                 if (RadioButton1.isSelected()) {          //选择学生身份

                                                        if (StringUntil.isEmpty(username)) {

                                                 JOptionPane.showMessageDialog(null, "用户名不能为空");

                                          return; // 要明白加上return的作用就是下面的带代码不再运行

                            }

                            if (StringUntil.isEmpty(password)) {

                                   JOptionPane.showMessageDialog(null, "密码不能为空");

                                   return;

                            }

                            AdminCon ac = new AdminCon();             //连接数据库调用的函数

String sql = "select * from student where sno='" + username + "' and studentpwd='" + password + "'"; // 把sql语句传给数据库操作对象

                            if (ac.Login(sql)) {

                                   this.dispose();    //关闭这个窗口

                                   new Student();              //调用学生界面

                            } else {

                                   JOptionPane.showMessageDialog(null, "用户名或密码错误!");

                            }

                     }

                     if (RadioButton2.isSelected()) {          //选择教师身份

                            if (StringUntil.isEmpty(username)) {

                                   JOptionPane.showMessageDialog(null, "用户名不能为空");

                                   return; // 要明白加上return的作用就是下面的带代码不再运行

                            }

                            if (StringUntil.isEmpty(password)) {

                                   JOptionPane.showMessageDialog(null, "密码不能为空");

                                   return;

                            }

                            AdminCon ac = new AdminCon();             //连接数据库所调用的函数

String sql = "select * from teacher where tno='" + username + "' and teacherpwd='" + password + "'"; // 把sql语句传给数据库操作对象

                            if (ac.Login(sql)) {

                                   this.dispose();

                                   new Teacher();

                            } else {

                                   JOptionPane.showMessageDialog(null, "用户名或密码错误!");

                            }

                     }

                     if (RadioButton3.isSelected()) {          //选择管理员身份

                            if (StringUntil.isEmpty(username)) {

                                   JOptionPane.showMessageDialog(null, "用户名不能为空");

                                   return;

                            }

                            if (StringUntil.isEmpty(password)) {

                                   JOptionPane.showMessageDialog(null, "密码不能为空");

                                   return;

                            }

                            AdminCon ac = new AdminCon();             //管理员登录函数,验证登录

                            String sql = "select * from admin where admin='" + username + "' and adpwd='" + password + "'"; // 把sql语句传给数据库操作对象

                            if (ac.Login(sql)) {

                                   this.dispose();

                                   Admin a = new Admin();

//                                 a.setExtendedState(a.MAXIMIZED_BOTH);   设置窗口的最大化

                            }

                            else {

                                   JOptionPane.showMessageDialog(null, "用户名或密码错误!");

                            }}

              }

              if (e.getSource() == Button2) {

                     dispose();              //取消登录

              }}

 

 

2)学生选课功能

学生选课需要管理员开启学生选课功能了之后方可以进行选课功能界面,否则会提示还没到选课时间;选课功能界面含有可选课程和已选课程,学生可以根据课程名和教授名进行模糊查询,便可以查到想要选的课程,当点击选课按钮时,如果学生所选的课程不违反数据库的约束的话(譬如已选课程不能再重复选择),已选课程表当中就会刷新出刚刚选课的信息。

 

关键代码:

package view;   //程序在view包下

public class XuanKe extends JInternalFrame implements ActionListener{  //类继承内部窗口

       private JButton button;       //按钮

       PreparedStatement ps=null; 

       Connection ct=null;             

       ResultSet rs=null;

       Statement stmt;

       private JLabel lblNewLabel_2;  //标签

       private JLabel label;

       Vector rowData,columnNames;    //表1的列名

       Vector rowData1,columnNames1;        //表2的列名

       DefaultTableModel dtm=null;

       private JScrollPane scrollPane;                 //添加滚动条

       private JTable table;                           //表1

       private JTable table_1;

       private JScrollPane scrollPane_1;

       private JLabel label_1;

       private JButton Button2;

       private JTextField textField;                       //查询课程名文本框

       private JTextField textField_1;                   //查询教师名文本框

       @Override                                                      //重写

       public void actionPerformed(ActionEvent e) {   //监控点击按钮事件

              if(e.getSource()==button) {

                     String s = Start.text1.getText().toString();

                     String s1 = table.getValueAt(table.getSelectedRow(), 0).toString();   //将选择的行转为String类型

                     String s2 = table.getValueAt(table.getSelectedRow(), 2).toString();

                     String s3 = table.getValueAt(table.getSelectedRow(), 2).toString();

                     String sql = "insert into sct values('"+s+"','"+s1+"','"+s2+"','','123')";

                     try {

                            stmt = ct.createStatement();          //连接数据库

                            int i = stmt.executeUpdate(sql);

                            JOptionPane.showMessageDialog(null, "选课成功!");

                     } catch (SQLException e1) {

                            JOptionPane.showMessageDialog(null, "选课失败!");

                            e1.printStackTrace();

                     }

                     ((DefaultTableModel)table_1.getModel()).getDataVector().removeAllElements();

                     String sql1 = "select sct.sno,sct.cno,cname,teacher.tname,ccredit\r\n" +

                                   "from teacher,course,sct,student\r\n" +        //根据多表查询显示在表中

                                   "where teacher.tno=sct.tno and course.cno=sct.cno and sct.sno=student.sno and sct.sno='"+Start.text1.getText().trim()+"'";

                     try {

                            ps = ct.prepareStatement(sql1);

                            rs=ps.executeQuery();

                            while(rs.next()){

                                   //rowData可以存放多行

                                   Vector hang=new Vector();

                                   hang.add(rs.getString(2));            //向表中添加某一行的元素

                                   hang.add(rs.getString(3));            //向表中添加某一行的元素

                                   hang.add(rs.getString(4));            //向表中添加某一行的元素

                                   hang.add(rs.getString(5));            //向表中添加某一行的元素

                                   //加入到rowData

                                   rowData1.add(hang);

                            }

                     } catch (SQLException e1) {

                            e1.printStackTrace();

                     }

              }

              if(e.getSource()==Button2) {

                     String text_1 = textField.getText().trim();

                     String text_2 = textField_1.getText().trim();

                     if(text_1.equals("")&&text_2.equals("")) {

                            JOptionPane.showMessageDialog(null, "你没有输入信息");

                     }else if(!text_1.equals("")&&!text_2.equals("")){

                            for (int i = 0; i < table.getRowCount(); i++) {

                                   if(table.getValueAt(i, 1).toString().contains(text_1)&&table.getValueAt(i, 3).toString().contains(text_2)) {

                                          table.setRowSelectionInterval(i,i);  //设置某一行被选中

                                          return;

                                   }

                            }

                     }else {

                            JOptionPane.showMessageDialog(null, "课程名和教师名对话框都需要输入");

                     }

                     }

       }

       public XuanKe() {                                                      //构造函数

              setTitle("\u5B66\u751F\u9009\u8BFE");            //设置标题名字

              setMaximizable(true);                                       //内置窗口可以最大化

              setIconifiable(true);                                         

              setClosable(true);                                             //设置内置窗口可以关闭

              setBounds(100, 50, 589, 500);                           //设置窗口的大小

              getContentPane().setLayout(null);                      //设置布局管理

              JLabel label = new JLabel("\u5B66\u751F\u9009\u8BFE\u529F\u80FD");

              label.setIcon(new ImageIcon(XuanKe.class.getResource("/images/\u5B66\u751F\u7BA1\u7406.png")));

              label.setFont(new Font("宋体", Font.PLAIN, 16));

              label.setBounds(227, 20, 145, 27);

              getContentPane().add(label);

              JScrollPane scrollPane = new JScrollPane();

              scrollPane.setViewportBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));

              scrollPane.setBounds(47, 87, 392, 170);

              getContentPane().add(scrollPane);

              columnNames=new Vector();

              //设置列名

              columnNames.add("课程号");

              columnNames.add("课程名");

              columnNames.add("教工号");

              columnNames.add("教师名");

              columnNames.add("学分");

              rowData = new Vector();

              table = new JTable(rowData,columnNames);

              table=new JTable(rowData,columnNames){

             public boolean isCellEditable(int row, int column)

                  {

                      return false;}//表格不允许被编辑

      };

              table.setFillsViewportHeight(true);

              scrollPane.setViewportView(table);

              try {

                     Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

//加载驱动       ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a");         //连接数据库

                     ps=ct.prepareStatement("select cno,cname,tno,tname,ccredit\r\n" +

                                   "from course,teacher\r\n" +

                                   "where cno=cno1 or cno=cno2 or cno=cno3");

                     rs=ps.executeQuery();

                     while(rs.next()){

                            //rowData可以存放多行

                            Vector hang=new Vector();

                            hang.add(rs.getString(1));

                            hang.add(rs.getString(2));

                            hang.add(rs.getString(3));

                            hang.add(rs.getString(4));

                            hang.add(rs.getInt(5));

                            //加入到rowData

                            rowData.add(hang);

                     }

               } catch (ClassNotFoundException e) {

                     e.printStackTrace();

              }

                    catch (SQLException e) {

                     e.printStackTrace();

              }

              button = new JButton("\u9009\u8BFE");

              button.setIcon(new ImageIcon(XuanKe.class.getResource("/images/\u786E\u8BA4.png")));

              button.setBounds(474, 225, 89, 32);

              getContentPane().add(button);

              scrollPane_1 = new JScrollPane();

              scrollPane_1.setViewportBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));

              scrollPane_1.setBounds(50, 310, 389, 133);

              getContentPane().add(scrollPane_1);

              columnNames1=new Vector();

              //设置列名

              columnNames1.add("课程号");

              columnNames1.add("课程名");

              columnNames1.add("教师名");

              columnNames1.add("学分");

              rowData1 = new Vector();

              try {

                     Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

                     ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a");

                     String sql = "select sct.sno,sct.cno,cname,teacher.tname,ccredit\r\n" +

                                   "from teacher,course,sct,student\r\n" +

                                   "where teacher.tno=sct.tno and course.cno=sct.cno and sct.sno=student.sno and sct.sno='"+Start.text1.getText().trim()+"'";

                     ps = ct.prepareStatement(sql);

                     rs=ps.executeQuery();

                     while(rs.next()){

                            //rowData可以存放多行

                            Vector hang=new Vector();

                            hang.add(rs.getString(2));

                            hang.add(rs.getString(3));

                            hang.add(rs.getString(4));

                            hang.add(rs.getString(5));

                            //加入到rowData

                            rowData1.add(hang);

                     }

              } catch (ClassNotFoundException | SQLException e1) {

                     e1.printStackTrace();

              }

              table_1 = new JTable(rowData1,columnNames1);       //设置表中有多少行与列

              table_1.setFillsViewportHeight(true);         

              scrollPane_1.setViewportView(table_1);

              JLabel lblNewLabel = new JLabel("\u53EF\u9009\u8BFE\u7A0B");

              lblNewLabel.setBounds(47, 66, 54, 15);

              getContentPane().add(lblNewLabel);

              label_1 = new JLabel("\u5DF2\u9009\u8BFE\u7A0B");

              label_1.setBounds(47, 289, 54, 15);

              getContentPane().add(label_1);

              Button2 = new JButton("\u67E5\u8BE2");

              Button2.setIcon(new ImageIcon(XuanKe.class.getResource("/images/\u641C\u7D22.png")));

              Button2.setBounds(474, 183, 89, 32);

              getContentPane().add(Button2);

              textField = new JTextField();

              textField.setBounds(475, 87, 88, 21);

              getContentPane().add(textField);

              textField.setColumns(10);

              JLabel lblNewLabel_1 = new JLabel("\u8BFE\u7A0B\u540D\uFF1A");

              lblNewLabel_1.setBounds(474, 66, 54, 15);

              getContentPane().add(lblNewLabel_1);

              JLabel lblNewLabel_3 = new JLabel("\u6559\u5E08\u540D\uFF1A");

              lblNewLabel_3.setBounds(474, 118, 54, 15);

              getContentPane().add(lblNewLabel_3);

              textField_1 = new JTextField();

              textField_1.setColumns(10);

              textField_1.setBounds(474, 143, 88, 21);

              getContentPane().add(textField_1);

              button.addActionListener(this);                   //添加事件按钮监听

              Button2.addActionListener(this);                 //添加事件按钮监听

              scrollPane = new JScrollPane();                  //添加滚动条

              scrollPane.setBounds(37, 41, 428, 148);

              setVisible(true);                                        //设置当前窗口可见

       }

}

 

 

 

3)教师录入成绩功能

学生考试结束后,教师可以录入学生的成绩,单职业选了该任课老师的课,该老师才能够查看该学生课程信息并且录入成绩,否则,该老师并不能够查看学生信息并且录入成绩。

 

 

public class TeaInsert extends JInternalFrame implements ActionListener,ListSelectionListener{

    private JTextField textField;       //学号文本框

    private JTextField textField_1;     //课程号文本框

    private JTextField textField_2;     //成绩文本框

    private JButton Button;             //录入成绩按钮     

    private JPanel contentPane;

    private JButton button;             //查询成绩按钮

    Vector rowData,columnNames; //表中行与列

    Connection conn=null;

    ResultSet rs=null;

    Statement stmt;

    PreparedStatement ps=null;

    Connection ct=null;

    private JTable table;               //表

    DefaultTableModel dtm=null;

    int mode=0;

    @Override

    public void valueChanged(ListSelectionEvent e) {

        int i = table.getSelectedRow();     //表中选择的某一行

        if(i>=0) {

            textField.setText(table.getValueAt(i, 0)+"");   //设置学号文本框对应选择行的学号值

            textField_1.setText(table.getValueAt(i, 2)+""); //设置课程号文本框对应选择行的课程号值

            textField_2.setText(table.getValueAt(i, 4)+""); //设置分数文本框对应选择分数的学号值

            }

    }

    @Override

    public void actionPerformed(ActionEvent e) {    //按钮点击触件

        int t =table.getSelectedRow();

        if(e.getSource()==Button) {

            try {

                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");    //加载数据库

            ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a");        //连接数据库

                String sql = "update sct set grade='"+textField_2.getText().trim()+"' where sno='"+textField.getText().trim()+"' and cno='"+textField_1.getText().trim()+"' and tno='"+Start.text1.getText().trim()+"'";

                 try {

                        stmt = ct.createStatement();   //执行数据库的命令

                        int i = stmt.executeUpdate(sql);

                    } catch (SQLException e1) {

                        JOptionPane.showMessageDialog(null, "录入成绩失败!");

                        e1.printStackTrace();

                    }

            } catch (ClassNotFoundException | SQLException e1) {

                e1.printStackTrace();

            }

             dtm.setDataVector(rowData,columnNames);

             table.setValueAt(textField_2.getText().trim(), t , 3);

        }

        if(e.getSource()==button) {

            String stname = textField.getText().trim().toString();

            if(StringUntil.isEmpty(stname)) {

                JOptionPane.showMessageDialog(null, "输入为空");

                return;

            }

            for (int i = 0; i < table.getRowCount(); i++) {

                String strtable = table.getValueAt(i, 0).toString().trim();

                String strtable1 = table.getValueAt(i, 1).toString().trim();

                String strtable2 = table.getValueAt(i, 4).toString().trim();

                if(strtable.contains(stname)) {

                    table.setRowSelectionInterval(i,i);         //选择到某一行

        }}}

    }

    public TeaInsert() {        //录入成绩的构造函数

        setTitle("\u5F55\u5165\u6210\u7EE9");       //设置标题

        setResizable(true);                         //设置可最大化

        setClosable(true);                         

        setMaximizable(true);                       //设置内置窗口可最大化 

        setIconifiable(true);

        setBounds(120, 90, 550, 414);

        JDesktopPane desktopPane = new JDesktopPane();

        desktopPane.setToolTipText("\u5F55\u5165\u6210\u7EE9");

        desktopPane.setBounds(0, 0, 534, 384);

        desktopPane.setBackground(SystemColor.control);

        JLabel lblNewLabel = new JLabel("\u5F55\u5165\u5B66\u751F\u6210\u7EE9");

        lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 16));

        lblNewLabel.setBounds(221, 14, 109, 26);

        desktopPane.add(lblNewLabel);

        JLabel lblNewLabel_1 = new JLabel("\u5B66\u53F7\uFF1A");

        lblNewLabel_1.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u5B66\u53F7.png")));

        lblNewLabel_1.setBounds(40, 275, 66, 15);

        desktopPane.add(lblNewLabel_1);

        JLabel lblNewLabel_2 = new JLabel("\u8BFE\u7A0B\u53F7\uFF1A");

        lblNewLabel_2.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u8BFE\u7A0B\u5217\u8868.png")));

        lblNewLabel_2.setBounds(194, 275, 82, 15);

        desktopPane.add(lblNewLabel_2);

        JLabel lblNewLabel_3 = new JLabel("\u5206\u6570\uFF1A");

        lblNewLabel_3.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u5B66\u5206.png")));

        lblNewLabel_3.setBounds(366, 275, 66, 15);

        desktopPane.add(lblNewLabel_3);

        textField = new JTextField();

        textField.setBounds(109, 272, 54, 21);

        desktopPane.add(textField);

        textField.setColumns(10);

        textField_1 = new JTextField();

        textField_1.setBounds(274, 272, 54, 21);

        desktopPane.add(textField_1);

        textField_1.setColumns(10);

        textField_2 = new JTextField();

        textField_2.setBounds(432, 272, 54, 21);

        desktopPane.add(textField_2);

        textField_2.setColumns(10);

        Button = new JButton("\u5F55\u5165\u6210\u7EE9");

        Button.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u4FEE\u6539.png")));

        Button.setBounds(316, 331, 109, 32);

        Button.addActionListener(this);

        desktopPane.add(Button);

        JScrollPane scrollPane = new JScrollPane();         //设置滚动条

        scrollPane.setBounds(40, 50, 446, 194);

        desktopPane.add(scrollPane);

        columnNames=new Vector();

        //设置列名

        columnNames.add("学号");

        columnNames.add("姓名");

        columnNames.add("课程号");

        columnNames.add("课程名");

        columnNames.add("成绩");

        rowData = new Vector();

        dtm = new DefaultTableModel(rowData,columnNames);

        table = new JTable(dtm);

        table=new JTable(dtm){

             public boolean isCellEditable(int row, int column)

                  {

                      return false;}//表格不允许被编辑

      };

       TableRowSorter sorter = new TableRowSorter(table.getModel());

       table.setRowSorter(sorter);

      try {

            //加载驱动

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            //得到连接

        ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a");

            String sql = "select sct.sno,sname,sct.cno,cname,grade,tno\r\n" +

                    "from sct,student,course\r\n" +

                    "where sct.sno=student.sno and course.cno=sct.cno";

            ps=ct.prepareStatement(sql);

            rs=ps.executeQuery();

            while (rs.next()) {

                if (rs.getString("tno").trim().equals(Start.text1.getText().trim())) {

                    Vector hang = new Vector();

                    hang.add(rs.getString(1));

                    hang.add(rs.getString(2));

                    hang.add(rs.getString(3));

                    hang.add(rs.getString(4));

                    hang.add(rs.getInt(5));

                    // 加入到rowData

                    rowData.add(hang);

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally{

                try {

                    if(rs!=null){

                    rs.close();

                    }

                    if(ps!=null){

                        ps.close();

                    }

                    if(ct!=null){

                        ct.close();

                    }

                } catch (SQLException e) {

                    e.printStackTrace();

                }

        }

        table.getSelectionModel().addListSelectionListener(this);

        getContentPane().setLayout(null);

        table.setFillsViewportHeight(true);

        scrollPane.setViewportView(table);

        getContentPane().add(desktopPane);

        button = new JButton("\u67E5\u8BE2\u5B66\u751F");

        button.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u641C\u7D22.png")));

        button.setBounds(122, 331, 109, 32);

        button.addActionListener(this);         //添加触键按钮事件监听器

        desktopPane.add(button);

        contentPane = new JPanel();             //容器选择是Jpanel();

        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

        contentPane.setLayout(new BorderLayout(0, 0));

        setVisible(true);        //设置当前窗口可见

    }

}

 

 

4)管理员报表功能

              管理员可以在相应的窗口界面上显示学生、教师、课程、院系、选课等信息并且按照一定的条件筛选出并且可以通过打印机输出的功能。

 

public class StuReport extends JInternalFrame implements ActionListener{  //学生报表

    private JTable table;                  //报表中用到显示的表

    public static JTextField textField;       //学号

    public static JTextField textField_1;  //性别

    public static JTextField textField_2;  //学院

    private JButton Button2;           //刷新按钮

    private JButton Button1;           //报表按钮

    private JScrollPane scrollPane;        //滚动条

    AdminCon ac = new AdminCon();          //调用连接数据库函数

    PreparedStatement ps=null;

    Connection ct=null;

    ResultSet rs=null;

    Statement stmt = null;

    Vector rowData,columnNames;       //容器行与列

    DefaultTableModel dtm=null;

    private JLabel Labelcount;

    String sql = null;                     //数据库语句

    @Override

    public void actionPerformed(ActionEvent e) {  //按钮触件

           String tableName;

          if(e.getSource()==Button2) {        //刷新表

              ((DefaultTableModel)table.getModel()).getDataVector().removeAllElements();

              String text_1 = textField.getText().trim();

              String text_2 = textField_1.getText().trim();

              String text_3 = textField_2.getText().trim();

              studentreport(text_1,text_2,text_3);

          }

          if(e.getSource()==Button1) {        //学生数据报表

              String SQL = "select * from student";

              tableName="学生表";             //生成的excel表名

              try {

                  ReportTable.Path(table,tableName,SQL);

              } catch (ClassNotFoundException | SQLException | IOException e1) {

                  e1.printStackTrace();

              }}

    }

    public void studentreport(String text_1,String text_2,String text_3) {  //多条件查询

       int count=0;

       if(!text_1.equals("")||!text_2.equals("")||!text_3.equals("")) {

           sql ="select * from student where p=123 ";

           if(!text_1.equals("")) {

                  sql=sql+"and sno LIKE '%"+text_1+"%'";        //可以进行模糊查询

           }

           if(!text_2.equals("")) {

              sql =sql+"and ssex LIKE '%"+text_2+"%'";

           }

           if(!text_3.equals("")) {

              sql =sql+"and sdept LIKE '%"+text_3+"%'";

           }

              try {

                  stmt = ct.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

                  rs=stmt.executeQuery(sql);

                  while(rs.next()){              

                     //rowData可以存放多行

                     Vector hang=new Vector();   //向table表中添加一行的数据元素

                     hang.add(rs.getString(1));

                     hang.add(rs.getString(2));

                     hang.add(rs.getString(3));

                     hang.add(rs.getInt(4));

                     hang.add(rs.getString(5));

                     rowData.add(hang);

                     count++;

                  }

              } catch (SQLException e) {

                  e.printStackTrace();

              }

              Labelcount.setText("共查询到"+count+"条记录");}

       }

   public void database() {

           int count=0;

           try {

              ps=ct.prepareStatement("select * from student");

               rs=ps.executeQuery();

              while(rs.next()){

                  //rowData可以存放多行

                  Vector hang=new Vector();

                  hang.add(rs.getString(1));

                  hang.add(rs.getString(2));

                  hang.add(rs.getString(3));

                  hang.add(rs.getInt(4));

                  hang.add(rs.getString(5));

                  rowData.add(hang);

                  count++;

              }

              Labelcount.setText("共查询到"+count+"条记录");

           } catch (SQLException e) {

              e.printStackTrace();

           }

       }

 

 

 

 

 

  1. 软件操控数据库操作

 

   

Java连接Sql Server 2012数据库需要一个.jar包,在连接数据库操作之前需要把.jar包添加到java编译环境的路径之下, 否则代码会显示错误。

 

连接数据库的代码:

public class TotalConn {

    public Connection getCon(){

       String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //加载数据库驱动的代码

    String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=BigTest";  //sql server数据库的默认端口是1433,我的数据库名称是BigTest;

        try {

           Class.forName(driverName);//加载驱动,若显示错误,表明加载失败

       } catch (ClassNotFoundException e) {

           e.printStackTrace();

       }

        Connection conn = null;

        try {

       conn = DriverManager.getConnection(dbURL, "sa", "432156789a"); //连接数据库,用户名是“sa”,密码是“432156789a”

       } catch (SQLException e) {

           e.printStackTrace();

       }

        return conn;

    }

    public void closeCon(Connection conn)throws Exception{

       if(conn!=null){

           conn.close();

       }

    }

    public static void main(String[] args) {

       TotalConn tc=new TotalConn();

       try {

            tc.getCon();    //连接数据库的函数

           System.out.println("数据库连接成功!");

       } catch (Exception e) {

           e.printStackTrace();

           System.out.println("数据库连接失败");

       }}}

 

从后台读取数据库的代码:

        try {

        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a");

           ps=ct.prepareStatement("select * from department");

           rs=ps.executeQuery();

           while(rs.next()){           //将数据库中的数据读取东控制台表中

              //rowData可以存放多行

               Vector hang=new Vector();

              hang.add(rs.getString(1));

              hang.add(rs.getString(2));

              hang.add(rs.getString(3));

              //加入到rowData

              rowData.add(hang);

           }

       } catch (Exception e) {

           e.printStackTrace();

       }

 

查询、插入、更新、删除数据到数据库的代码:

查询:ResultSet rs = null;

       String sql=null;

       Statement stmt = null;

       Connection dconn = Conn();

sql ="select * from department where oo=12 ";

while(rs.next()) {

       s = s + "系编号:"+rs.getString(1)+"   学院:"+rs.getString(2)+"   系主任:"+rs.getString(3);

              i=1; }

 

插入:String sql = "insert into course values('"+textField.getText().trim()+"','"+textField_1.getText().trim()+"','"+textField_2.getText().trim()+"','"+comboBox.getSelectedItem()+"','12')";

 

 

更新:String sql = "update sct set grade='"+textField_2.getText().trim()+"' where sno='"+textField.getText().trim()+"' and cno='"+textField_1.getText().trim()+"' and tno='"+Start.text1.getText().trim()+"'";

                                          stmt = ct.createStatement();   //执行数据库的命令

                                          int i = stmt.executeUpdate(sql);

                                   } catch (SQLException e1) {

                                          JOptionPane.showMessageDialog(null, "录入成绩失败!");

                                  

 

删除:String sql = "delete from course where cno='"+table.getValueAt(table.getSelectedRow(), 0)+"'"

 

你可能感兴趣的:(基于java所写的学生选课管理系统)