Deng
Deng
学生信息管理系统总结 | odjBlog
    欢迎来到odjBlog的博客!

学生信息管理系统总结

web前端学习 odjbin 4年前 (2021-08-16) 105次浏览 0个评论

2021 年 7 月 31 日早 8 点左右

1、创建好数据库中对应表的实体类(student、teacher、subject、class_room、sel_subject)如:

2、连接数据库

  • IDEA:文件—项目结构—库—加号+—java—选择对应下载位置的文件驱动—添加—一直 next

3、登录界面

  • 通过调用 stuDao【连接数据库的类和查询用户名密码方法】的方法从数据库中查询出用户信息,再比对密码

(1)专门用户密码登录

(2)不同用户名和密码登录

  • 登录成功后弹出,另一个界面:

  • 只需在登录成功语句后,加一个新界面

    new MyFrame("学生信息管理系统",100,100,400,400);

  • 密码不可见性:使用【密码框】 JPasswordField t2;

    输入的是一串符号

      @Override
    public void actionPerformed(ActionEvent e) {
        JButton b = (JButton)e.getSource();
        if(b.equals(b2)){
            this.setNull();
        }else if(b.equals(b1)){
            // 通过调用 stuDao 的方法从数据库充查询出用户信息,再比对密码
            StuDao stuDao = new StuDao();
            Student student = stuDao.findByName(t1.getText());
            if(student!=null&&student.getPassword().equals(t2.getText())){
                JOptionPane.showMessageDialog(this, "登录成功!!");
                this.setVisible(false);
                new MyFrame("学生信息管理系统",100,100,400,400);
            }else{             JOptionPane.showMessageDialog(this, "用户名或密码错误,请重新输入!");
            }
        }
    }

    4、编辑主界面

  • 采用菜单项,多面板切换显示

public class MyFrame extends JFrame implements ActionListener {
    JMenuBar bar;
    JMenu menu1;
    JMenuItem add;
    Panel contentPanel;
 public MyFrame(String title,int x,int y,int width,int height)
    {
        bar=new JMenuBar();
//1、添加记录菜单项
        menu1=new JMenu("添加记录");
        bar.add(menu1);
        add=new JMenuItem("学生");
        menu1.add(add);
        contentPanel=new Panel();
        //菜单项添加事件监听器
        add.addActionListener(this);
//设置窗口属性
        this.setJMenuBar(bar);
        this.setContentPane(new JLabel());
        this.setTitle(title);
        this.setBounds(x, y, width, height);
        this.setVisible(true);          this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
}
 @Override
    public void actionPerformed(ActionEvent e) {
        Object obj=e.getSource();
        if(obj==add){
            changeContentPane(new AddPanel());
        }else if(obj==delete1){
            changeContentPane(new DeletePanel());
        }
    }
//切换内容面板
    public void changeContentPane(Container contentPane){
        this.setContentPane(contentPane);
        this.revalidate();
    }
  • 然后分别创每个菜单项的面板类,不断运行,调整每个文本框的位置

  • 注意细节:按钮添加监视器

    ​ 实例化每个平面

    ​ 角标正确

    2021 年 8 月 1 日 10 点左右

1、报错:Local variable 'stu' is redundant
局部变量是多余的

stu = new Student(number,name,sex,password,score);
 return stu;
 ///////////////////////////
 return new Student(number,name,sex,password,score);
 ```
 2、打开多个模板
​       右上角设置—项目结构—加号—新建、导入—确定
3、IDEA 重启
​       文件——清除缓存——重启
4、IDEA 项目重构
​       菜单栏下面的榔头形状的绿色  构建项目
5、在主面板中弹出另一个界面
​           在多面板中,添加一个按钮、然后
​           浏览——点击浏览信息——确定
```java
 @Override
    public void actionPerformed(ActionEvent e) {
        JButton b = (JButton)e.getSource();
        if(b.equals(b1)){            JOptionPane.showMessageDialog(this, "请先添加你需要浏览的内容!!");//点击确定
            new Sframe("浏览",400,400,500,500);
        }
    }

2021 年 8 月 2 日午 9 点多

1、显式类型参数 Student 可以替换为 <>

List list;
  list = new ArrayList();
 /////////////////////////////////
 List list;
  list = new ArrayList<>();

2、删除功能

使用方法要先实例出该方法的对象

dao=new StuDao();

否则 会报错 删除失败

3、Statement 中的三个 executeXXX()方法

  • executeQuery: 只能执行 select 语句
  • executeUpdate: 可以执行 insert、delete 和 update 语句,但不能执行 select
  • execute:增删改查的 4 种(任意)语句都能执行。

4、按姓名删除功能

  • 按什么删除 则 where xxx=?
  • 在窗口一个界面中按学号(姓名)删除的按钮,分开定义各方法(即使一样的方法,改个名字)
//按姓名删除
public boolean delete2(String name)
    {
        boolean flag = false;
        con = getCon();
        try {
            pst = con.prepareStatement("delete from student where name=?");
            pst.setString(1, name);//按什么则定义什么
            pst.execute();
            flag = true;
            pst.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return flag;
    }
@Override
public void actionPerformed(ActionEvent e) {
if(b==b3){
            dao=new StuDao();
            String name = t2.getText();
            if(dao.delete2(name)) {
                JOptionPane.showMessageDialog(this, "恭喜你删除成功!!");
            }else{
                JOptionPane.showMessageDialog(this, "删除失败!!!");
            }
            this.setNull1();
        }
    }

5、添加功能

  • 报错:Column count doesn't match value count at row 1

    ​ 列不匹配

    要先看报错,而不是在错的那一行,自己盲目改错

  • 报错:Can not issue data manipulation statements with executeQuery()

    不能发出数据操纵语句与 executeQuery()

    • executeQuery: 只能执行 select 语句
    • executeUpdate: 可以执行 insert、delete 和 update 语句,但不能执行 select
    • execute:增删改查的 4 种(任意)语句都能执行。
  • 添加部分数据

    //3、创建预处理语句对象
    pst = con.prepareStatement("insert into student values(null,?,?,?,?,null)");
    //没有添加的数据用 null 表示
            pst.setInt(1, number);
            pst.setString(2, name);
            pst.setInt(3, sex);
            pst.setDouble(4, score);
    //这些 1、2、3、4 对应的是?在第几个的位置

    6、statement 和 prepareStatement 的区别

  • JDBC 驱动会发送一个网络请求到数据解析和优化这个查询,而执行时会产生另一个网络请求,在 JDBC 驱动中,减少网络通讯是最终的目的.

  • 访问数据库的速度:

    prepareStatement 会先初始化 SQL,先把这个 SQL 提交到数据库中进行预处理,多次使用可提高效率。
    createStatement 不会初始化,没有预处理,每次都是从 0 开始执行

  • SQL 对于只执行一次的 SQL 语句选择 Statement 是最好的。

  • 相反, 如果 SQL 语句被多次执行选用 PreparedStatement 是最好的。

  • PreparedStatement 的第一次执行消耗是很高的, 它的性能体现在后面的重复执行,使用 PreparedStatement 的方式来执行一个针对数据库表的查询。

  • 如果程序在运行期间只需要一次请求, 那么就使用 Statement. 对于 Statement, 同一个查询只会产生一次网络到数据库的通讯.

7、按学号查询

 public Student findById(int id)
    {
        Student stu = null;
        con = getCon();
        try {
            pst = con.prepareStatement("select * from student where number=?");
            pst.setInt(1, id);
            rs= pst.executeQuery();
            if(rs.next())
            {//2、3、4、5 是数据库中列的位置
                int number = rs.getInt(2);
                String name = rs.getString(3);
                int  sex = rs.getInt(4);
                int score=rs.getInt(5);
                stu = new Student(number,name,sex,score);
            }
        }catch (SQLException e) {
            e.printStackTrace();
        }
        return stu;
    }

8、更新功能

  • 先添加一个查找按钮在更新界面里面、查找出来之后再修改数据点击更新

    pst = con.prepareStatement("update student set name=?,sex=?,score=? number=?");
            pst.setString(1, stu.getName());
            pst.setInt(2, stu.getSex());
            pst.setInt(3,stu.getScore());
            pst.setInt(4, stu.getNumber());
    //如果没有 where number=? 语句则数据库中数据全改为,界面上的数据了
    //正确的:
    public boolean update(Student stu)
    {
        boolean flag = false;
        con = getCon();
        try {
            //注意问号和 1/2/3/4  数据要对应、否则会混乱数据
            pst = con.prepareStatement("update student set name=?,sex=?,score=? where number=?");
            pst.setString(1, stu.getName());
            pst.setInt(2, stu.getSex());
            pst.setInt(3,stu.getScore());
            pst.setInt(4, stu.getNumber());
            pst.executeUpdate();
            flag = true;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return flag;
    }

    9、选课功能

  • 定义一个添加到数据库 student 表中课程的选择按钮(字为选择,实则赋予添加功能),和一个选课完之后的查询显示功能

  • 报错:Column 'id' cannot be null

    主键 id 要设置为自动递增【Default——AUTO_INCREMENT】否则添加不进去

  • 赋予按钮功能时,要注意按钮角标正确。

10、登录的三个组件

  • JTextField【文本框】:用于输出文本、是明文。
  • JPasswordField 【密码框】:用于输入密码,输入的是一串符号
  • JLabel:用于显示一串字符。(文本框和密码框的字就是标签)

10、注册界面

  • 增加注册功能:添加功能:添加用户名和密码到数据库中
  • 在注册界面时:删去此行代码,然后注册完之后,点击右上角叉叉×,返回开始界面,进行登录。
  • this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  • ​ this.setUndecorated(true); 【设置窗口不可移动,无顶部标题等装饰】
  • this.setLocationRelativeTo(null); 【屏幕正中央】

    8 月 4 日午 11 点左右

1、变量命名规范

首单词字母小写,后面每一个单词首字母大小、驼峰原则,知晓其意

2、 改为数据表界面

public class MyTableByTeacher extends JFrame implements ActionListener {
    JTable jTable;
     public MyTableByTeacher() throws SQLException, ClassNotFoundException {
        StuDao stuDao = new StuDao();
        String arr[] = {"学号", "名字", "性别", "成绩", "专业"};
        String comm[][] = stuDao.getStudentList();
         //以 comm 和 arr 为参数,创建一个表格
        dtm = new DefaultTableModel(comm, arr);
        jTable = new JTable(dtm);
         //设置此表视图的首选大小
        jTable.setPreferredScrollableViewportSize(new Dimension(600, 150));
        //将表格加入到滚动条组件中
        scrollPane = new JScrollPane(jTable);
        this.add(scrollPane, BorderLayout.CENTER);
       jTable.getTableHeader().setReorderingAllowed(false);//列不能移动
        jTable.getTableHeader().setResizingAllowed(false);//不可拉动表格
//      jTable.setEnabled(false);//表格不可更改数据
          this.setTitle("数据表");
        this.setVisible(true);//设置窗体可见
        this.validate();//设置组件可见
        this.pack();//自动调整组建大小使每个组件都能显示
        this.setBounds(200, 200, 600, 260);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }

3、动态刷新功能

  StuDao 类中:
//刷新
    public void changTable(DefaultTableModel dtm) {
        String[][] comm = getGoodsList("", "");
        int index = dtm.getRowCount();
        while (index != 1) {
            try {
                dtm.removeRow(0);
                index = dtm.getRowCount();
            } catch (RuntimeException e) {
                e.printStackTrace();
            }
        }
        for (int i = 0; i < comm.length; i++) {
            dtm.addRow(comm[i]);
        }
        dtm.removeRow(0);
        dtm.fireTableDataChanged();
    }
    public String[][] getStudentList(){
        con = getCon();
        try {
            pst = con.prepareStatement("select * from student ");
            rs = pst.executeQuery();
            rs.last();int row = rs.getRow();//获取记录的总条数
            rs.beforeFirst();//游标回到第一个记录前的位置
            String comm[][] = new String[row][5];//row 行、5 列
            rs.next();//游标回到第一个记录的位置
            for (int i = 0; i < row; i++) {
                comm[i][0] = rs.getString("number");
                comm[i][1] = rs.getString("name");
                comm[i][2] = rs.getString("sex");
                comm[i][3] = rs.getString("score");
                comm[i][4] = rs.getString("profession");
                rs.next();
            }
            rs.close();
            return comm;
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                pst.close();
                con.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return null;
    }

4、销毁窗口
dispose();

5、老师身份的数据表新增功能:

数据学号唯一性?/?/【该学号已经存在,弹出对话框,判断新增学号是否存在事件???】("因为我在第一个文本框右边加入了一个标签,因此,如果编号已经存在,那么就会出现一个红×不可以注册,绿色√代表可以注册."??)

JButton b = (JButton)e.getSource();
// 添加
if (b== keep) {
    dao=new StuDao();
    Student stu=this.getStu();
    if (dao.addStudent(stu)) {
        JOptionPane.showMessageDialog(this, "恭喜你添加成功!!");
        StuDao stuDao = new StuDao();
        stuDao.changTable(dtm);
        // 销毁窗口、就可以销毁上一个窗口
                dispose();
 }

6、老师身份的数据表修改功能

public class MyTableByTeacher extends JFrame implements ActionListener {
    JTable jTable;
     public MyTableByTeacher() throws SQLException, ClassNotFoundException {
// 监听表格中修改变化
        jTable.getModel().addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
                // 获取到修改的第几列
                int col = e.getColumn();
                //获取到修改的第几行
                int row = e.getFirstRow();
                Student stu = new Student();
                String number = (String) dtm.getValueAt(row, 0);
                stu.setNumber(Integer.parseInt(number));
                String name = (String) dtm.getValueAt(row, 1);
                stu.setName(name);
                String sex = (String) dtm.getValueAt(row, 2);
                stu.setSex(Integer.parseInt(sex));
                String score = (String) dtm.getValueAt(row, 3);
                stu.setScore(Integer.parseInt(score));
                String profession = (String) dtm.getValueAt(row, 4);
                stu.setProfession(profession);
                stuDao.update(stu);
            }
        });
     }
 ///////////////////////////////////////////////////////
     @Override
    public void actionPerformed(ActionEvent e) {
        JButton b = (JButton) e.getSource();
        if (b == update) {
            UpdateFrame updateFrame = new UpdateFrame("更新", 500, 500, 320, 260);
            updateFrame.setDtm(dtm);
            int row = jTable.getSelectedRow();
            if (row != -1) {
                String number = (String) dtm.getValueAt(row, 0);
                updateFrame.number.setText(number);
                updateFrame.name.setText((String) dtm.getValueAt(row, 1));
                updateFrame.sex.setText((String) dtm.getValueAt(row, 2));
                updateFrame.score.setText((String) dtm.getValueAt(row, 3));
                updateFrame.profession.setText((String) dtm.getValueAt(row, 4));
            }
        }
    }

7、老师身份的数据表删除功能

if (b == delete) {
            int row = jTable.getSelectedRow();
            if (row != -1) {
                String number = (String) dtm.getValueAt(row, 0);
                StuDao stuDao = new StuDao();                           stuDao.deleteByNumber(Integer.parseInt(number));
                stuDao.changTable(dtm);
                System.out.println(number);
            }
        }

8、 学生身份选课下拉列表

public class underChoose extends Panel implements ActionListener{
    JLabel chooseSubject;
    JComboBox underSubject;
    JButton choose;
    JPanel p1;
    public underChoose(){
        chooseSubject =new JLabel("选择课程");
        underSubject =new JComboBox();
        underSubject.addActionListener(this);
        choose =new JButton("选择");
        choose.addActionListener(this);
        String List1[]={"计算机","音乐","美术"};
        for (int i = 0; i < 3; i++) {
            underSubject.addItem(List1[i]);
        }
        p1 =new JPanel();
        p1.add(chooseSubject);
        p1.add(underSubject);
        this.add(p1,BorderLayout.CENTER);
        this.setLayout(new FlowLayout());
        this.setVisible(true);
    }
//////////////////////////
    public SelSubject getSel() {
        SelSubject sel=new SelSubject();       underSubject.getSelectedItem());
        return sel;
    }
//////////////////////////////////
@Override
 public void actionPerformed(ActionEvent e) {
      if(underSubject.getSelectedItem()=="计算机"&&e.getSource()== choose||underSubject.getSelectedItem()=="音乐"&&e.getSource()== choose||underSubject.getSelectedItem()=="美术"&&e.getSource()== choose){
          dao = new SelSubDao();
            SelSubject sel = this.getSel();
            if(dao.addSelSubject(sel)){                JOptionPane.showMessageDialog(this, "选择成功!!");
            }else{               JOptionPane.showMessageDialog(this, "输入格式错误,请重新输入!");}
      }
 }
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
已稳定运行:3年255天5小时18分