javaFX + mysql 学生管理系统---超详细

目录

一、er图

二、主页面

三、学生注册

四、学生登录

1)登录界面

2)查看分数

3)修改信息

五、教师功能

1)教师登录

2)管理部分学生

1.增加学生

2.删除学生

3.修改学生

4.查询学生

5.刷新

六、管理员功能

1)管理员登录

2)管理全部学生

3)管理教师

4)学生成绩统计(柱状图)

七、提示窗口

八、特色

1)学生密码加密

2)管理员成绩统计柱状图

九、全部代码

1)目录结构

2)dao文件夹

3)pojo文件夹

4)utils文件夹

Main

Manager_operate

Teacher_operate


一、er图

二、主页面

    /**
     * 主入口
     */
    public static void main(String[] args) {
        launch(args);
    }


    @Override
    public void start(Stage stage) {
        Main.stage = stage;
        stage.setResizable(false);

        begin();
        stage.show();
    }


    /**
     * 首页面
     */
    public static void begin() {
        GridPane gridPane = new GridPane();
        stage.setTitle("学生管理系统首页");
        //设置gridPane 的一些属性
        ViewUtils.setGridPane(gridPane);

        Button manageLog = new Button("管理员登录");
        Button teacherLog = new Button("教师登录");
        Button studentLog = new Button("学生登录");
        Button studentSign = new Button("学生注册");

        //点击管理员登录按钮
        manageLog.setOnAction(actionEvent -> {
            Manager_operate.managerLog();
        });

        //点击老师登录按钮
        teacherLog.setOnAction(actionEvent -> {
            teacher_log();
        });

        //点击学生登录按钮
        studentLog.setOnAction(actionEvent -> {
            student_log();
        });

        //点击学生注册按钮
        studentSign.setOnAction(actionEvent -> {
            student_sign();
        });

        VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 20, Pos.CENTER, manageLog, teacherLog, studentLog, studentSign);
        Scene scene = new Scene(vBox, 500, 400);
        stage.setScene(scene);
    }


 

三、学生注册

 

    /**
     * 学生的一些操作
     * ------------------------------------------------------------------------------------------------------------------------
     * 学生注册
     */
    public static void student_sign() {
        stage.setTitle("学生注册");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);//设置GridPane的一些属性

        Label id = new Label("学生学号");
        TextField idTxt = new TextField();
        Label pwd = new Label("学生密码");
        PasswordField pwdFld = new PasswordField();
        Label name = new Label("学生姓名");
        TextField nameTxt = new TextField();
        Label sex = new Label("性别");
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        Label grade = new Label("学生年级");
        TextField gradeTxt = new TextField();
        Label teacher_id = new Label("教师姓名");
        TextField teacher_idTxt = new TextField();
        Button sign = new Button("注册");
        Button back = new Button("返回");

        //点击注册按钮
        sign.setOnAction(actionEvent -> {
            //数据要符合规范,grade,classSchool成绩必须是数字的形式,并且1<=grade<=4,0<=成绩<=100,ID必须没有重复
            //数据是否为空
            boolean isEmpty = !idTxt.getText().trim().equals("") && !pwdFld.getText().trim().equals("") && !nameTxt.getText().trim().equals("")
                    && (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().trim().equals("");

            //部分数据的范围是否合适
            boolean isSuitable =  !gradeTxt.getText().trim().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText().trim()), 1, 4);
            boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText().trim()) && !studentDao.judge_StudentIDIsExist(idTxt.getText().trim());

            //要注册的学生ID不能存在,学生的教师姓名必须是存在的
            if (isEmpty && isSuitable && isSuitable2) {
                String sexDemo = man.isSelected() ? "男" : "女";

                studentDao.insert_student(idTxt.getText().trim(), pwdFld.getText().trim(), nameTxt.getText().trim(), sexDemo, Integer.parseInt(gradeTxt.getText().trim()), teacher_idTxt.getText().trim());
                ViewUtils.tips("注册成功");
                begin();//注册成功后返回到主页面

            } else if (!isSuitable2) {
                ViewUtils.tips("请检查教师姓名或学生ID是否正确");
            } else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击取消按钮,返回首页面
        back.setOnAction(actionEvent -> {
            begin();
        });

        //将男,女单选添加到单行面板中
        HBox hBox = new HBox(man, woman);

        gridPane.add(id, 0, 0);
        gridPane.add(idTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdFld, 1, 1);
        gridPane.add(name, 0, 2);
        gridPane.add(nameTxt, 1, 2);
        gridPane.add(sex, 0, 3);
        gridPane.add(hBox, 1, 3);
        gridPane.add(grade, 0, 4);
        gridPane.add(gradeTxt, 1, 4);
        gridPane.add(teacher_id, 0, 5);
        gridPane.add(teacher_idTxt, 1, 5);
        gridPane.add(sign, 0, 7);
        gridPane.add(back, 1, 7);

        //设置性别只能选择一个
        //将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
        ToggleGroup toggleGroup = new ToggleGroup();
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 500, 400);
        stage.setScene(scene);
    }

四、学生登录

1)登录界面

 

    /**
     * 学生登录页面
     */
    public static void student_log() {
        stage.setTitle("学生登录");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label idLabel = new Label("学生学号");
        TextField idTxt = new TextField();
        Label pwdLabel = new Label("学生密码");
        PasswordField pwdFld = new PasswordField();
        Button log = new Button("登录");
        Button back = new Button("返回");

        //点击登录
        log.setOnAction(actionEvent -> {
            try {
                if (studentDao.student_log(idTxt.getText().trim(), pwdFld.getText().trim())) {
                    //进入学生选项(trim()去掉字符串两端的空格)
                    student_select(idTxt.getText().trim(), pwdFld.getText().trim());
                }else {
                    ViewUtils.tips("请检查数据");
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });

        //点击取消
        back.setOnAction(actionEvent -> {
            begin();
        });


        //安排每个组件的位置
        gridPane.add(idLabel, 0, 0);
        gridPane.add(idTxt, 1, 0);
        gridPane.add(pwdLabel, 0, 1);
        gridPane.add(pwdFld, 1, 1);
        gridPane.add(log, 0, 3);
        gridPane.add(back, 1, 3);

        Scene scene = new Scene(gridPane, 500, 400);
        stage.setScene(scene);
    }


    /**
     * 学生登录后选择选项
     * @param id : 传入ID用来查看学生分数 或 修改学生信息
     * @param pwd : 传入ID用来查看学生分数 或 修改学生信息
     */
    public static void student_select(String id, String pwd) {
        stage.setTitle("学生选择");
        Button checkScore = new Button("查看分数");
        Button update = new Button("修改信息");
        Button back = new Button("返回");

        //点击查看分数
        checkScore.setOnAction(actionEvent -> {
            student_checkScore(id, pwd);
        });

        //点击修改信息
        update.setOnAction(actionEvent -> {
            student_modify(id, pwd);
        });

        //点击取消
        back.setOnAction(actionEvent -> {
            begin();
        });

        VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 20, Pos.CENTER, checkScore, update, back);
        Scene scene = new Scene(vBox, 500, 400);
        stage.setScene(scene);
    }


2)查看分数

学生只能查看,不能更改分数

    /**
     * 学生查看分数页面
     * @param id : 传入学生ID
     * @param pwd : 点击取消时,将ID和p 传入到student_select方法中
     */
    public static void student_checkScore(String id, String pwd) {
        stage.setTitle("学生查询成绩");

        String encryption_pwd = MD5Utils.md5Encryption(pwd);
        Student student =  studentDao.select_studentByOneself(id, encryption_pwd);

        Label id2 = new Label("学号 :  " + student.getId());
        Label p2 = new Label("密码 :  " + pwd);
        Label name = new Label("姓名 :  " + student.getName());
        Label sex = new Label("性别 :  " + student.getSex());
        Label grade = new Label("年级 :  " + student.getGrade());
        Label chinese = new Label("语文 :  " + student.getChinese());
        Label math = new Label("数学 :  " + student.getMath());
        Label english = new Label("英语 :  " + student.getEnglish());
        Label chemistry = new Label("化学 :  " + student.getChemistry());
        Label political = new Label("政治 :  " + student.getPolitical());
        Label history = new Label("历史 :  " + student.getHistory());
        Label total_score = new Label("总分 :  " + student.getTotal_score());
        Label teacher_id = new Label("教师姓名 :  " + student.getTeacher_id());
        Button back = new Button("返回");

        //点击返回按钮,返回首页面
        back.setOnAction(actionEvent -> {
            student_select(id, pwd);
        });

        //单列面板
        VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 10, Pos.CENTER,id2, p2, name, sex, grade,  chinese, math, english, chemistry, political, history, total_score, teacher_id, back);
        Scene scene = new Scene(vBox, 300, 530);
        stage.setScene(scene);
    }

3)修改信息

学生不能修改自己的学号和成绩

    /**
     * 学生修改自己的信息
     * @param id : 通过ID来搜索到我们要修改的学生
     * @param p : 点击取消时,将ID和p 传入到student_select方法中
     */
    public static void student_modify(String id, String p) {
        stage.setTitle("学生修改信息");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        //修改自己数据的时候把数据填充一下
        String encryption_pwd = MD5Utils.md5Encryption(p);
        Student student = studentDao.select_studentByOneself(id, encryption_pwd);

        Label pwd = new Label("学生密码");
        TextField pwdTxt = new TextField(p);
        Label name = new Label("学生姓名");
        TextField nameTxt = new TextField(student.getName());
        Label sex = new Label("性别");
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        if (student.getSex().equals("男")) {
            man.setSelected(true);
        } else if (student.getSex().equals("女")) {
            woman.setSelected(true);
        }
        Label grade = new Label("学生年级");
        TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
        Label teacher_id = new Label("教师姓名");
        TextField teacher_idTxt = new TextField(student.getTeacher_id());
        Button modify = new Button("修改");
        Button back = new Button("返回");


        //点击修改
        modify.setOnAction(actionEvent -> {
            //数据要符合规范,grade,classSchool,成绩必须是数字的形式,并且1<=grade<=4,0<=成绩<=100,ID必须没有重复;教师必须存在
            boolean isEmpty = !pwdTxt.getText().equals("")  && !nameTxt.getText().equals("") && (man.isSelected() ||
                    woman.isSelected()) && !teacher_idTxt.getText().equals("");
            boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
            boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
            boolean isExists = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText());

            if (isEmpty && isNum && isSuitable && isExists) {
                String sexDemo = man.isSelected() ? "男" : "女";

                //教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
                studentDao.update_studentByOneself(id, pwdTxt.getText(), nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()), studentDao.replaceName_withId(teacher_idTxt.getText()));

                ViewUtils.tips("修改成功");
                student_select(id, pwdTxt.getText());
            }else if (!isExists) {
                ViewUtils.tips("请检查该教师是否存在");
            }else {
                ViewUtils.tips("请检查数据");
            }

        });

        //点击取消按钮,返回首页面
        back.setOnAction(actionEvent -> {
            student_select(id, p);
        });

        //将男,女单选添加到单行面板中
        HBox hBox = new HBox(man, woman);

        gridPane.add(pwd, 0, 0);
        gridPane.add(pwdTxt, 1, 0);
        gridPane.add(name, 0, 1);
        gridPane.add(nameTxt, 1, 1);
        gridPane.add(sex, 0, 2);
        gridPane.add(hBox, 1, 2);
        gridPane.add(grade, 0, 3);
        gridPane.add(gradeTxt, 1, 3);
        gridPane.add(teacher_id, 0, 4);
        gridPane.add(teacher_idTxt, 1, 4);
        gridPane.add(modify, 0, 6);
        gridPane.add(back, 1, 6);

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 500, 400);
        stage.setScene(scene);
    }


 

五、教师功能

1)教师登录

教师只能增删改查属于自己的学生 

    /**
     * 教师的相关操作
     * ------------------------------------------------------------------------------------------------------------------------
     * 教师登录
     */
    public static void teacher_log() {
        stage.setTitle("教师登录");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label teacherID = new Label("教师工号");
        TextField teacherIDTxt = new TextField();
        Label pwd = new Label("教师密码");
        PasswordField pwdFld = new PasswordField();
        Button log = new Button("登录");
        Button cancel = new Button("取消");

        //点击登录按钮
        log.setOnAction(actionEvent -> {
            if (teacherDao.teacher_log(teacherIDTxt.getText().trim(), pwdFld.getText().trim())) {
                manageStudent(true, teacherIDTxt.getText().trim());
            }else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击取消按钮,返回首页面
        cancel.setOnAction(actionEvent -> {
            begin();
        });

        gridPane.add(teacherID, 0, 0);
        gridPane.add(teacherIDTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdFld, 1, 1);
        gridPane.add(log, 0, 2);
        gridPane.add(cancel, 1, 2);

        Scene scene = new Scene(gridPane, 500, 400);
        stage.setScene(scene);
    }






    /**
     * 教师,管理员管理学生
     * @param select : true.老师管理学生;false.管理员管理学生(因为老师和管理员的返回界面不同,所以要分两种情况)
     */
    public static void manageStudent(boolean select, String id_t) {
        //学生集合
        ArrayList<Student> students = new ArrayList<>();

        stage.setTitle("管理学生");
        BorderPane borderPane = new BorderPane();

        Button add = new Button("增加");
        Button delete = new Button("删除");
        Button update = new Button("修改");
        Button query = new Button("查询");
        Button refresh = new Button("刷新");
        Button back = new Button("返回");

        //点击增加学生
        add.setOnAction(actionEvent -> {
            if (select) {
                Teacher_operate.addStudent(borderPane, students, id_t);
            }else {
                Manager_operate.addStudent_forManager(borderPane, students);
            }
        });

        //点击删除学生
        delete.setOnAction(actionEvent -> {
            //删除学生和管理员删除老师的界面相同
            //删除学生,true:删除学生,false:删除老师
            if (select) {
                Teacher_operate.deletePerson(borderPane, students, id_t);
            }else {
                Manager_operate.deletePerson(borderPane, students, null, true);
            }
        });

        //点击修改学生
        update.setOnAction(actionEvent -> {
            //先输入ID号码判断是否存在该学生,如果存在就修改学生
            //true.老师或管理员修改学生;false.管理员修改老师
            if (select) {
                Teacher_operate.inputID(borderPane, students, id_t);
            }else {
                Manager_operate. inputID(borderPane, students, null, true);
            }

        });

        //点击查询学生
        query.setOnAction(actionEvent -> {
            if (select) {
                Teacher_operate.queryStudent_byTeacher(borderPane, students, id_t);
            }else {
                Manager_operate.queryStudent_forManager(borderPane, students);
            }
        });

        //点击刷新
        refresh.setOnAction(actionEvent -> {
            if (select) {
                Teacher_operate.refresh_studentTable_forTeacher(borderPane, students, id_t);
            }else {
                Manager_operate.refresh_studentTable_forManager(borderPane, students);
            }

        });

        //点击返回
        back.setOnAction(actionEvent -> {
            //教师退出该页面
            if (select) {
                begin();
            }else  {
                //管理员退出该页面
                Manager_operate.managerSelect();
            }
        });

        //单行面板
        HBox hBox = ViewUtils.getHBox("-fx-font-size: 18;", 40, Pos.CENTER, true, add, delete, update, query, refresh, back);
        //设置borderPane的背景颜色
        borderPane.setBackground(new Background(new BackgroundFill(Color.rgb(200, 200, 200),null,null)));//设置hBox的背景颜色
        //设置返回按钮的外边距
        hBox.setMargin(back, new Insets(20, 20, 20, 60));

        //将hBox 单行面板 添加到边界布局的顶部
        borderPane.setTop(hBox);

        //从数据库中把学生数据全部填写到students集合中
        if (select) {//教师查询学生
            studentDao.selectAll_studentTable_forTeacher(students, id_t);
        }else {
            studentDao.selectAll_studentTable_forManager(students);
        }

        //展示学生表格
        studentTable(borderPane, students);
        stage.setScene(new Scene(borderPane,1042, 500));
    }







    /**
     * 学生表格(通用:适合教师和管理员对学生的管理)
     * @param borderPane : 边界布局
     * @param students : 学生集合
     */
    public static void studentTable(BorderPane borderPane, ArrayList<Student> students) {
        //学生的信息表格
        TableView<Student> tableView = new TableView<>();

        //TableColumn类 创建列。然后使用TableView 类的 getColumns()方法将创建的列添加到表中。
        TableColumn id = new TableColumn<>("学号");
        TableColumn pwd = new TableColumn<>("密码");
        TableColumn name = new TableColumn<>("姓名");
        TableColumn sex = new TableColumn<>("性别");
        TableColumn grade = new TableColumn<>("年级");
        TableColumn chinese = new TableColumn<>("语文");
        TableColumn math = new TableColumn<>("数学");
        TableColumn english = new TableColumn<>("英语");
        TableColumn chemistry = new TableColumn<>("化学");
        TableColumn political = new TableColumn<>("政治");
        TableColumn history = new TableColumn<>("历史");
        TableColumn total_score = new TableColumn<>("总分");
        TableColumn teacher_id = new TableColumn<>("教师");

        //表格列宽宽度设置
        id.setMinWidth(70);
        pwd.setMinWidth(70);
        name.setMinWidth(60);
        sex.setMinWidth(60);
        grade.setMinWidth(60);
        chinese.setMinWidth(60);
        math.setMinWidth(60);
        english.setMinWidth(60);
        chemistry.setMinWidth(60);
        political.setMinWidth(60);
        history.setMinWidth(60);
        total_score.setMinWidth(60);
        teacher_id.setMinWidth(70);

        //确定数据导入的列
        id.setCellValueFactory(new PropertyValueFactory<>("id"));
        pwd.setCellValueFactory(new PropertyValueFactory<>("pwd"));
        name.setCellValueFactory(new PropertyValueFactory<>("name"));
        sex.setCellValueFactory(new PropertyValueFactory<>("sex"));
        grade.setCellValueFactory(new PropertyValueFactory<>("grade"));
        chinese.setCellValueFactory(new PropertyValueFactory<>("chinese"));
        math.setCellValueFactory(new PropertyValueFactory<>("math"));
        english.setCellValueFactory(new PropertyValueFactory<>("english"));
        chemistry.setCellValueFactory(new PropertyValueFactory<>("chemistry"));
        political.setCellValueFactory(new PropertyValueFactory<>("political"));
        history.setCellValueFactory(new PropertyValueFactory<>("history"));
        total_score.setCellValueFactory(new PropertyValueFactory<>("total_score"));
        teacher_id.setCellValueFactory(new PropertyValueFactory<>("teacher_id"));

        //将列添加到表格中
        tableView.getColumns().addAll(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);

        //将学生数组集合添加到表格中
        tableView.getItems().addAll(students);

        //将表格添加到边界布局的正中心
        borderPane.setCenter(tableView);
    }

2)管理部分学生

1.增加学生

教师增加学生和学生自己注册基本一致

    /**
     * 教师增加学生
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID
     */
    public static void addStudent(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();

        ViewUtils.setTopTip("增加学生",tipStage);
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label studentID = new Label("学生学号");
        TextField studentIDTxt = new TextField();
        Label pwd = new Label("学生密码");
        TextField pwdTxt = new TextField();
        Label name = new Label("学生姓名");
        TextField nameTxt = new TextField();
        Label sex = new Label("性别");
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        Label grade = new Label("学生年级");
        TextField gradeTxt = new TextField();
        Label teacher_id = new Label("教师姓名");
        TextField teacher_idTxt = new TextField();
        Button add = new Button("增加");
        Button back = new Button("返回");
        //单行面板
        HBox hBox = new HBox(man, woman);

        gridPane.add(studentID, 0, 0);
        gridPane.add(studentIDTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdTxt, 1, 1);
        gridPane.add(name, 0, 2);
        gridPane.add(nameTxt, 1, 2);
        gridPane.add(sex, 0, 3);
        gridPane.add(hBox, 1, 3);
        gridPane.add(grade, 0, 4);
        gridPane.add(gradeTxt, 1, 4);
        gridPane.add(teacher_id, 0, 6);
        gridPane.add(teacher_idTxt, 1, 6);
        gridPane.add(add, 0, 8);
        gridPane.add(back, 1, 8);

        //点击增加学生
        add.setOnAction(actionEvent -> {
            //数据要符合规范
            boolean isEmpty = !studentIDTxt.getText().equals("") && !pwdTxt.getText().equals("")  && !nameTxt.getText().equals("")
                    && (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().equals("");
            boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
            boolean isSuitable = !gradeTxt.getText().equals("") &&  CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
            //要判断教师的姓名是否存在,而不是教师ID,教师姓名要存在;学生学号不能存在
            boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && !studentDao.judge_StudentIDIsExist(studentIDTxt.getText());

            Student student = new Student();
            student.setTeacher_id(teacher_idTxt.getText());
            student.setId(studentID.getText());
            studentDao.select_teacherByTeacher_id(student);
            boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);

            try {
                //学生ID不能重复;学生修改的教师必须存在
                if (isEmpty && isNum && isSuitable && isSuitable2 && isSuitable3) {
                    String sexDemo = man.isSelected() ? "男" : "女";

                    studentDao.insert_student(studentIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo,
                            Integer.parseInt(gradeTxt.getText()), teacher_idTxt.getText());

                    ViewUtils.tips("增加成功");
                    tipStage.close();
                    //刷新表格中的数据
                    refresh_studentTable_forTeacher(borderPane, students, id_t);

                }else if (!isSuitable2) {
                    ViewUtils.tips("请检查教师姓名或学生ID");
                }else {
                    ViewUtils.tips("请检查数据");
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 340, 400);
        tipStage.setScene(scene);
        tipStage.show();
    }

2.删除学生

    /**
     * 删除学生,老师
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID
     */
    public static void deletePerson(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("删除人员", tipStage);
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label ID = new Label("ID号码 :  ");
        TextField IDTxt = new TextField();
        Button delete = new Button("删除");
        Button back = new Button("返回");

        gridPane.add(ID, 0, 0);
        gridPane.add(IDTxt, 1, 0);
        gridPane.add(delete, 0, 2);
        gridPane.add(back, 1, 2);

        //点击删除按钮
        delete.setOnAction(actionEvent -> {

            Student student = new Student();
            student.setTeacher_id(id_t);
            student.setId(IDTxt.getText());
            studentDao.select_teacherByTeacher_id(student);
            boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);

            //删除学生,先判断是否存在该学生
            if (studentDao.judge_StudentIDIsExist(IDTxt.getText()) && isSuitable3) {
                studentDao.delete_student(IDTxt.getText());
                ViewUtils.tips("成功删除该学生");
                tipStage.close();
                //刷新表格中的数据
                refresh_studentTable_forTeacher(borderPane, students, id_t);
            }else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 360, 200);
        tipStage.setScene(scene);
        tipStage.show();
    }

 

3.修改学生

先输入ID号码

输入ID后会自动显示原先的数据,教师无法更改学生的密码

 

    /**
     * 教师修改学生:必须先输入正确的ID号码后,才能修改
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID,用于判断某个老师是否可以操作某个学生(教师只能操作自己的学生)
     */
    public static void inputID(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("搜索ID号码", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label ID = new Label("ID号码 :  ");
        TextField IDTxt = new TextField();
        Button search = new Button("搜索");
        Button back = new Button("返回");

        gridPane.add(ID, 0, 0);
        gridPane.add(IDTxt, 1, 0);
        gridPane.add(search, 0, 2);
        gridPane.add(back, 1, 2);

        //点击搜索按钮
        search.setOnAction(actionEvent -> {
            Student student = new Student();
            student.setTeacher_id(id_t);
            student.setId(IDTxt.getText());
            studentDao.select_teacherByTeacher_id(student);
            boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);

            //修改学生,先查询该学生是否存在,而且要修改的学生属于该教师
            if (studentDao.judge_StudentIDIsExist(IDTxt.getText()) && isSuitable3) {
                updateStudent(borderPane, students, IDTxt.getText(), id_t);
                tipStage.close();
            }else {
                ViewUtils.tips("请检查数据");
            }

        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 360, 200);
        tipStage.setScene(scene);
        tipStage.show();
    }





    /**
     * 输入正确的ID号码后,教师修改学生(学生的密码无法修改)
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_sOld : 需要修改的学生的 原来的ID号码,我们要根据原来的ID来查找这个学生
     * @param id_t : 教师ID
     */
    public static void updateStudent(BorderPane borderPane, ArrayList<Student> students, String id_sOld, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("修改学生", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        //先查询这个学生
        studentDao.select_studentTableByID_forTeacher(students, id_sOld, id_t);
        Student student = students.get(0);


        Label studentID = new Label("学号 :  ");
        TextField studentIDTxt = new TextField(student.getId());
        Label name = new Label("姓名 :  " );
        TextField nameTxt = new TextField(student.getName());
        Label sex = new Label("性别 :  " );
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        if (student.getSex().equals("男")) {
            man.setSelected(true);
        } else if (student.getSex().equals("女")) {
            woman.setSelected(true);
        }
        Label grade = new Label("年级 :  ");
        TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
        Label chinese = new Label("语文 :  " );
        TextField chineseTxt = new TextField(String.valueOf(student.getChinese()));
        Label math = new Label("数学 :  " );
        TextField mathTxt = new TextField(String.valueOf(student.getMath()));
        Label english = new Label("英语 :  " );
        TextField englishTxt = new TextField(String.valueOf(student.getEnglish()));
        Label chemistry = new Label("化学 :  " );
        TextField chemistryTxt = new TextField(String.valueOf(student.getChemistry()));
        Label political = new Label("政治 :  " );
        TextField politicalTxt = new TextField(String.valueOf(student.getPolitical()));
        Label history = new Label("历史 :  " );
        TextField historyTxt = new TextField(String.valueOf(student.getHistory()));
        Label teacher_id = new Label("教师姓名 :  " );
        TextField teacher_idTxt = new TextField(student.getTeacher_id());
        Button update = new Button("修改");
        Button back = new Button("返回");

        //单行面板
        HBox hBox = new HBox(man, woman);

        gridPane.add(studentID, 0, 0);
        gridPane.add(studentIDTxt, 1, 0);
        gridPane.add(name, 0, 1);
        gridPane.add(nameTxt, 1, 1);
        gridPane.add(sex, 0, 2);
        gridPane.add(hBox, 1, 2);
        gridPane.add(grade, 0, 3);
        gridPane.add(gradeTxt, 1, 3);
        gridPane.add(chinese, 0, 4);
        gridPane.add(chineseTxt, 1, 4);
        gridPane.add(math, 0, 5);
        gridPane.add(mathTxt, 1, 5);
        gridPane.add(english, 0, 6);
        gridPane.add(englishTxt, 1, 6);
        gridPane.add(chemistry, 0, 7);
        gridPane.add(chemistryTxt, 1, 7);
        gridPane.add(political, 0, 8);
        gridPane.add(politicalTxt, 1, 8);
        gridPane.add(history, 0, 9);
        gridPane.add(historyTxt, 1, 9);
        gridPane.add(teacher_id, 0, 10);
        gridPane.add(teacher_idTxt, 1, 10);
        gridPane.add(update, 0, 12);
        gridPane.add(back, 1, 12);

        //点击修改按钮
        update.setOnAction(actionEvent -> {
            //是否为空
            boolean isData = !studentIDTxt.getText().equals("") && !nameTxt.getText().equals("") && (man.isSelected() || woman.isSelected());
            //其中的班级和分数是否可以转换为数字
            boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText()) && CommonUtils.isStrToNum(chineseTxt.getText()) && CommonUtils.isStrToNum(mathTxt.getText()) &&
                    CommonUtils.isStrToNum(englishTxt.getText()) && CommonUtils.isStrToNum(chemistryTxt.getText()) && CommonUtils.isStrToNum(politicalTxt.getText()) &&
                    CommonUtils.isStrToNum(historyTxt.getText());
            //数据是否合适
            boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4) &&
                    !chineseTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chineseTxt.getText()), 0, 100) &&
                    !mathTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(mathTxt.getText()), 0, 100) &&
                    !englishTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(englishTxt.getText()), 0, 100) &&
                    !chemistryTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chemistryTxt.getText()), 0, 100) &&
                    !politicalTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(politicalTxt.getText()), 0, 100) &&
                    !historyTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(historyTxt.getText()), 0, 100);
            //判断该教师是否存在;判断新修改的学生ID是否已经被占有了
            boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && (!studentDao.judge_StudentIDIsExist(studentIDTxt.getText()) || studentIDTxt.getText().equals(id_sOld));

            boolean isSuitable3 =  teacherDao.judgeTeacher_nameAndId(teacher_idTxt.getText(), id_t);

            //数据正常
            if (isData && isNum && isSuitable && isSuitable2 && isSuitable3){
                String sexDemo = man.isSelected() ? "男" : "女";
                int totalScore = Integer.parseInt(chineseTxt.getText()) + Integer.parseInt(mathTxt.getText()) + Integer.parseInt(englishTxt.getText()) +
                        Integer.parseInt(chemistryTxt.getText()) + Integer.parseInt(politicalTxt.getText()) + Integer.parseInt(historyTxt.getText());

                //教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
                //修改学生信息
                //把数据封装到Student对象中,传入到函数
                Student student1 = new Student(studentIDTxt.getText(),"", nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()),
                        Integer.parseInt(chineseTxt.getText()), Integer.parseInt(mathTxt.getText()), Integer.parseInt(englishTxt.getText()), Integer.parseInt(chemistryTxt.getText()),
                        Integer.parseInt(politicalTxt.getText()), Integer.parseInt(historyTxt.getText()), totalScore, studentDao.replaceName_withId(teacher_idTxt.getText()));

                studentDao.update_studentByTeacherAndManager(id_sOld, student1);

                ViewUtils.tips("修改成功");
                tipStage.close();
                //刷新表格中的数据
                refresh_studentTable_forTeacher(borderPane, students, id_t);
            }else  {
                ViewUtils.tips("请检查数据");
            }

        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();
        //将单选按钮添加到到ToggleGroup对象,ToggleGroup对象将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 440, 680);
        tipStage.setScene(scene);
        tipStage.show();
    }


4.查询学生

两种查询方式:ID查询、姓名模糊查询

    /**
     * 教师查询学生
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID
     */
    public static void queryStudent_byTeacher(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("可以进行ID查询、姓名模糊查询", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label studentID = new Label("学号 :  ");
        TextField studentIDTxt = new TextField();
        Label name = new Label("姓名 :  ");
        TextField nameTxt = new TextField();
        Button query = new Button("查询");
        Button back = new Button("返回");

        gridPane.add(studentID, 0, 0);
        gridPane.add(studentIDTxt, 1, 0);
        gridPane.add(name, 0, 1);
        gridPane.add(nameTxt, 1, 1);
        gridPane.add(query, 0, 3);
        gridPane.add(back, 1, 3);

        //点击查询按钮
        query.setOnAction(actionEvent -> {
            //只通过ID查询学生
            if (!studentIDTxt.getText().equals("") && nameTxt.getText().equals("")){
                //将ID符合的学生添加到students集合中
                studentDao.select_studentTableByID_forTeacher(students, studentIDTxt.getText(), id_t);

                Main.studentTable(borderPane, students);
                tipStage.close();

            } else if (studentIDTxt.getText().equals("") && !nameTxt.getText().equals("")) {//只通过姓名模糊查询
                //只通过姓名模糊查询
                studentDao.select_studentTableByName_forTeacher(students, nameTxt.getText(), id_t);

                Main.studentTable(borderPane, students);
                tipStage.close();

            } else { //没有输入数据
                ViewUtils.tips("请检查数据,二选一");
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 480, 400);
        tipStage.setScene(scene);
        tipStage.show();
    }

使用姓名模糊查询:输入‘刘’,结果: 

5.刷新

查询学生之后,我们点击刷新可恢复表格中的学生数据

    /**
     * 教师刷新学生表格(增加,删除,修改后调用)
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID
     */
    public static void refresh_studentTable_forTeacher(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //填写学生数据
        studentDao.selectAll_studentTable_forTeacher(students, id_t);

        //展示学生表格
        Main.studentTable(borderPane, students);
    }

六、管理员功能

1)管理员登录

    /**
     * 关于管理员自身的操作
     * ------------------------------------------------------------------------------------------------------------------------
     * 管理员登录
     */
    public static void managerLog() {
        Main.stage.setTitle("管理员登录");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label id = new Label("管理员ID");
        TextField idTxt = new TextField();
        Label pwd = new Label("管理员密码");
        PasswordField pwdFld = new PasswordField();
        Button log = new Button("登录");
        Button cancel = new Button("取消");

        //点击登录按钮
        log.setOnAction(actionEvent -> {
            if (managerDao.manager_log(idTxt.getText().trim(), pwdFld.getText().trim())) {
                managerSelect();
            }else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击取消按钮,返回首页面
        cancel.setOnAction(actionEvent -> {
            Main.begin();
        });

        gridPane.add(id, 0, 0);
        gridPane.add(idTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdFld, 1, 1);
        gridPane.add(log, 0, 2);
        gridPane.add(cancel, 1, 2);

        Scene scene = new Scene(gridPane, 500, 400);
        Main.stage.setScene(scene);
    }



    /**
     * 管理员登录后的 选择
     */
    public static void managerSelect() {
        Main.stage.setTitle("管理员选项");
        Button manageStudent = new Button("管理学生");
        Button manageTeacher = new Button("管理教师");
        Button dataStatistical = new Button("成绩统计");
        Button back = new Button("退出系统");

        //点击管理学生按钮
        manageStudent.setOnAction(actionEvent -> {
            Main.manageStudent(false, null);
        });

        //点击管理教师按钮
        manageTeacher.setOnAction(actionEvent -> {
            manageTeacher();
        });

        //点击成绩统计
        dataStatistical.setOnAction(actionEvent -> {
            dataStatistical();
        });

        //点击退出按钮
        back.setOnAction(actionEvent -> {
            Main.begin();
        });

        //单行面板
        VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 40, Pos.CENTER, manageStudent, manageTeacher, dataStatistical, back);
        Main.stage.setScene(new Scene(vBox, 500, 400));
    }


2)管理全部学生

代码和教师管理学生基本一致,只是教师管理的是教师自己的学生,管理员管理的是全部学生,后面有完整全部代码

3)管理教师

管理员管理教师和管理学生思路基本一致

4)学生成绩统计(柱状图)

 


    /**
     * 成绩柱状图
     */
    public static void dataStatistical() {
        Main.stage.setTitle("成绩统计");
        Button back = new Button("返回");

        //点击返回
        back.setOnAction(actionEvent -> {
            managerSelect();
        });

        CategoryAxis xAxis = new CategoryAxis();
        xAxis.setLabel("成绩分布");
        NumberAxis yAxis = new NumberAxis();
        yAxis.setLabel("人数");
        BarChart barChart = new BarChart<>(xAxis, yAxis);

        XYChart.Series dataSeries1 = new XYChart.Series();
        dataSeries1.setName("年级1");

        XYChart.Series dataSeries2 = null;
        XYChart.Series dataSeries3 = null;
        XYChart.Series dataSeries4 = null;

        try {
            dataSeries1.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(1, 0, 200)));
            dataSeries1.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(1, 200, 350)));
            dataSeries1.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(1, 350, 500)));
            dataSeries1.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(1, 500, 601)));

            dataSeries2 = new XYChart.Series();
            dataSeries2.setName("年级2");
            dataSeries2.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(2, 0, 200)));
            dataSeries2.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(2, 200, 350)));
            dataSeries2.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(2, 350, 500)));
            dataSeries2.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(2, 500, 601)));


            dataSeries3 = new XYChart.Series();
            dataSeries3.setName("年级3");
            dataSeries3.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(3, 0, 200)));
            dataSeries3.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(3, 200, 350)));
            dataSeries3.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(3, 350, 500)));
            dataSeries3.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(3, 500, 601)));

            dataSeries4 = new XYChart.Series();
            dataSeries4.setName("年级4");
            dataSeries4.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(4, 0, 200)));
            dataSeries4.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(4, 200, 350)));
            dataSeries4.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(4, 350, 500)));
            dataSeries4.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(4, 500, 601)));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        barChart.getData().add(dataSeries1);
        barChart.getData().add(dataSeries2);
        barChart.getData().add(dataSeries3);
        barChart.getData().add(dataSeries4);

        //单列面板
        VBox vBox = new VBox(barChart, back);
        vBox.setAlignment(Pos.CENTER);
        vBox.setMargin(back, new Insets(20, 0, 0, 0));

        Scene scene = new Scene(vBox, 500, 540);
        Main.stage.setScene(scene);
    }

七、提示窗口

 此时会出现提示窗口

提示窗口使用的十分频繁,所以我把它封装了一下放到utils中,以后使用可以直接调用函数

    /**
     * 设置顶层窗口的一些属性
     * @param str : 标题的内容
     * @param tipStage : 需要添加属性的窗口
     */
    public static void setTopTip(String str, Stage tipStage) {
        tipStage.setResizable(false);//不能调整大小
        tipStage.setTitle(str);//设置标题
        //只能操作当前的提示框
        tipStage.initOwner(Main.stage);
        tipStage.initModality(Modality.WINDOW_MODAL);
        //设置该提示框永远在最上层
        tipStage.setAlwaysOnTop(true);
    }



    /**
     * 提示框
     * @param content : 提示的信息
     */
    public static void tips(String content) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        //调用顶层窗口函数设置一些必要的属性
        setTopTip(content, tipStage);

        Label label = new Label(content);
        Button back = new Button("返回");

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //单列面板
        VBox vBox = new VBox(label, back);
        vBox.setSpacing(10);
        vBox.setAlignment(Pos.CENTER);

        Scene scene = new Scene(vBox, 180, 130);
        tipStage.setScene(scene);
        tipStage.show();
    }

 

八、特色

1)学生密码加密

我将学生密码进行加密存放到数据库中,该加密是不可逆加密,无法逆推

同样我将加密代码封装了一下放到了utils中

    /**
     * 使用JDK自带MessageDigest
     * @param pwd
     * @return
     */
    public static String md5Encryption(String pwd) {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("md5");

            byte[] bytes = messageDigest.digest(pwd.getBytes("UTF-8"));
            //16是表示转换为16进制数
            String result = new BigInteger(1, bytes).toString(16);

            return result;

        } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

 

2)管理员成绩统计柱状图

上面已经展示过代码了

这个柱状图是实时变化的,更改了数据库中的数据,柱状图也会变化

九、全部代码

1)目录结构

2)dao文件夹

ManagerImpl

package com.student_manageSystem.dao.impl;

import com.student_manageSystem.dao.ManageDao;
import com.student_manageSystem.utils.SQLUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class ManagerImpl implements ManageDao {
    /**
     * 管理员登录
     * @param id
     * @param pwd
     * @return
     */
    @Override
    public boolean manager_log(String id, String pwd) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = SQLUtils.getConnection();
            String sql = "select * from t_manager_table where id = ? && pwd = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.setString(2, pwd);

            rs = pstmt.executeQuery();
            return rs.next();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(rs, pstmt, conn);
        }
    }


    /**
     * 计算各个年级,各个分数段的人数
     * @param grade : 年级
     * @param from : 起始位置(包含)
     * @param to : 终止位置(不包含)
     * @return
     */
    public int histogram(int grade, int from, int to) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = SQLUtils.getConnection();
            String sql = "select count(id) as peopleNum from t_student_table where grade = ? && total_score >= ? && total_score < ?;";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, grade);
            pstmt.setInt(2, from);
            pstmt.setInt(3, to);
            rs = pstmt.executeQuery();

            int count = 0;
            if (rs.next()){
                count = rs.getInt("peopleNum");
            }
            return count;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(rs, pstmt, conn);
        }

    }


}

StudentImpl 

package com.student_manageSystem.dao.impl;

import com.student_manageSystem.dao.StudentDao;
import com.student_manageSystem.utils.MD5Utils;
import com.student_manageSystem.utils.SQLUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;


/**
 * StudentDao负责学生的增删改查
 */
public class StudentImpl implements StudentDao {

    /**
     * 判断学生的ID是否存在
     * @param id : id
     * @return : true:存在该数据,false:不存在
     */
    @Override
    public boolean judge_StudentIDIsExist(String id) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select * from t_student_table where id = ?";

        try {
            conn = SQLUtils.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            rs = pstmt.executeQuery();

            return rs.next();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //释放资源
            SQLUtils.closeResource(rs, pstmt, conn);
        }

    }




    /**
     * 学生登录
     * @param id : id
     * @param pwd : 密码
     * @return : true.正确;false.错误
     * @throws Exception
     */
    @Override
    public  boolean student_log(String id, String pwd) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select * from t_student_table where id = ? && pwd = ?";

        //不可逆加密,将学生输入的密码加密后与数据库中的加密密码比较,如果相等,就说明输入的密码正确
        String encryption_pwd = MD5Utils.md5Encryption(pwd);

        try {
            conn = SQLUtils.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.setString(2, encryption_pwd);
            rs = pstmt.executeQuery();

            return rs.next();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(rs, pstmt, conn);
        }

    }



    /**
     * 增加学生(包含:学生注册;老师或管理员增加学生)
     * @param grade
     * @param name
     * @param sex
     * @param pwd
     */
    @Override
    public void insert_student(String id, String pwd, String name, String sex, int grade, String teacher_id) {
        //我们传过来的teacher_id 其实是教师名字,这里我要把传过来的teacher_id(教师名字)改为真正的教师ID
        teacher_id = replaceName_withId(teacher_id);

        //将密码加密的结果添加到数据库中
        String encryption_pwd = MD5Utils.md5Encryption(pwd);

        try {
            Connection conn = SQLUtils.getConnection();
            String sql = "insert into t_student_table values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.setString(2, encryption_pwd);
            pstmt.setString(3, name);
            pstmt.setString(4, sex);
            pstmt.setInt(5, grade);
            pstmt.setInt(6, 0);
            pstmt.setInt(7, 0);
            pstmt.setInt(8, 0);
            pstmt.setInt(9, 0);
            pstmt.setInt(10, 0);
            pstmt.setInt(11, 0);
            pstmt.setInt(12, 0);
            pstmt.setString(13, teacher_id);

            int count = pstmt.executeUpdate();
            if (count > 0) System.out.println("成功注册或增加了一个学生");
            SQLUtils.closeResource(null, pstmt, conn);

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }



    /**
     * 通过学生的teacher_id(我们输入的其实是教师姓名) 来找到真实的教师ID(最后我们会把真实的教师ID存到学生数据库表中)
     * @param name
     */
    @Override
    public String replaceName_withId(String name) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select id from t_teacher_table where name = ? ";

        try {
            conn = SQLUtils.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            rs = pstmt.executeQuery();

            String id = null;
            if (rs.next()) {
                id = rs.getString("id");
            }
            return id;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //释放资源
            SQLUtils.closeResource(rs, pstmt, conn);
        }
    }






    /**
     * 教师、管理员删除学生
     * @param id
     * @throws Exception
     */
    @Override
    public void delete_student(String id) {
        try {
            Connection conn = SQLUtils.getConnection();
            String sql = "delete from t_student_table where id = ?";

            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,id);
            int count = pstmt.executeUpdate();
            if (count > 0) System.out.println("成功删除了一个学生");
            SQLUtils.closeResource(null, pstmt, conn);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }



    /**
     * 学生自己修改自己的信息(无法修改学号和成绩)
     * @param oldID
     * @param pwd
     * @param name
     * @param sex
     * @param grade
     * @throws Exception
     */
    @Override
    public void update_studentByOneself(String oldID, String pwd, String name, String sex, int grade, String teacher_id) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        //把密码加密
        String encryption_pwd = MD5Utils.md5Encryption(pwd);

        try {
            conn = SQLUtils.getConnection();
            String sql = "update t_student_table set pwd=?, name=?, sex=?, grade=?, teacher_id=? where id = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, encryption_pwd);
            pstmt.setString(2, name);
            pstmt.setString(3, sex);
            pstmt.setInt(4, grade);
            pstmt.setString(5, teacher_id);
            pstmt.setString(6, oldID);

            int count = pstmt.executeUpdate();
            if (count > 0) System.out.println("学生更改了自己的数据");

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(null, pstmt, conn);
        }
    }






    /**
     * 老师,管理员修改学生信息(可以修改学号,成绩)
     * @param oldID : 之前的学号,根据这个学号来查找到学生
     * @param student : 学生对象,里面封装了学生的属性
     */
    @Override
    public void update_studentByTeacherAndManager(String oldID, com.student_manageSystem.pojo.Student student) {

        try {
            Connection conn = SQLUtils.getConnection();
            String sql = "update t_student_table set id=?, name=?, sex=?, grade=?, chinese=?, math=?, english=?, chemistry=?, political=?, history=?, total_score=?, teacher_id=? where id = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, student.getId());
            pstmt.setString(2, student.getName());
            pstmt.setString(3, student.getSex());
            pstmt.setInt(4, student.getGrade());
            pstmt.setInt(5, student.getChinese());
            pstmt.setInt(6, student.getMath());
            pstmt.setInt(7, student.getEnglish());
            pstmt.setInt(8, student.getChemistry());
            pstmt.setInt(9, student.getPolitical());
            pstmt.setInt(10, student.getHistory());
            pstmt.setInt(11, student.getTotal_score());
            pstmt.setString(12, student.getTeacher_id());
            pstmt.setString(13, oldID);

            int count = pstmt.executeUpdate();
            if (count > 0) System.out.println("成功更新了学生数据");
            SQLUtils.closeResource(null, pstmt, conn);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }





    /**
     *  学生自己查看自己
     * @param id
     * @param pwd
     * @return
     */
    @Override
    public com.student_manageSystem.pojo.Student select_studentByOneself(String id, String pwd)  {
        com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = SQLUtils.getConnection();
            String sql = "select * from t_student_table where id = ? && pwd = ?";
            pstmt =conn.prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.setString(2, pwd);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                student.setId(rs.getString("id"));
                student.setPwd(rs.getString("pwd"));
                student.setName(rs.getString("name"));
                student.setSex(rs.getString("sex"));
                student.setGrade(rs.getInt("grade"));
                student.setChinese(rs.getInt("chinese"));
                student.setMath(rs.getInt("math"));
                student.setEnglish(rs.getInt("english"));
                student.setChemistry(rs.getInt("chemistry"));
                student.setPolitical(rs.getInt("political"));
                student.setHistory(rs.getInt("history"));
                student.setTotal_score(rs.getInt("total_score"));
                student.setTeacher_id(rs.getString("teacher_id"));

                //把teacher_id 改为 教师姓名
                select_teacherByTeacher_id(student);
            }

            //返回学生对象
            return student;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(rs, pstmt, conn);
        }
    }



    /**
     * 将学生的teacher_id 换成对应的真实教师姓名
     * @param student
     */
    @Override
    public void select_teacherByTeacher_id(com.student_manageSystem.pojo.Student student) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = SQLUtils.getConnection();
            //多表查询:显式内连接
            String sql = "select t.name from t_teacher_table t inner join t_student_table s on s.id = ? && t.id = s.teacher_id";
            pstmt =conn.prepareStatement(sql);
            pstmt.setString(1, student.getId());
            rs = pstmt.executeQuery();

            if (rs.next()) {
                String name = rs.getString("t.name");
                //把teacher_id 改为 teacher 的name
                student.setTeacher_id(name);
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(rs, pstmt, conn);
        }
    }





    /**
     * 把学生数据库中的 属于相应教师的 数据传递给学生表格(教师使用)
     * @param students
     * @param teacher_id : 教师的ID号码
     */
    @Override
    public void selectAll_studentTable_forTeacher(ArrayList<com.student_manageSystem.pojo.Student> students, String teacher_id) {
        try {
            Connection conn = SQLUtils.getConnection();
            //先清空所有的数据
            students.clear();

            //多表查询,隐式内连接
            String sql = "select s.* from t_student_table s, t_teacher_table t where t.id = s.teacher_id && s.teacher_id = ?;";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, teacher_id);
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                int grade = rs.getInt("grade");
                int chinese = rs.getInt("chinese");
                int math = rs.getInt("math");
                int english = rs.getInt("english");
                int chemistry = rs.getInt("chemistry");
                int political = rs.getInt("political");
                int history = rs.getInt("history");
                int total_score = rs.getInt("total_score");

                //创建student对象,并添加到ArrayList
                com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
                //把teacher_id 改为 teacher 的name
                select_teacherByTeacher_id(student);

                students.add(student);
            }
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, conn);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }



    /**
     * 通过  ID查询  把学生数据库中的数据传递给学生表格(教师使用)
     * @param students
     * @param id_s : 学生的ID号码
     * @param id_t : 教师的ID号码
     */
    @Override
    public void select_studentTableByID_forTeacher(ArrayList<com.student_manageSystem.pojo.Student> students, String id_s, String id_t) {
        try {
            Connection conn = SQLUtils.getConnection();
            //先清空所有的数据
            students.clear();

            //多表查询,显式内连接
            String sql = "select s.* from t_student_table s inner join t_teacher_table t on s.teacher_id = t.id && t.id = ? && s.id = ?;";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id_t);
            pstmt.setString(2, id_s);
            ResultSet rs = pstmt.executeQuery();

            //因为ID是唯一的,只有一个,所以不用使用while()
            if (rs.next()) {
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                int grade = rs.getInt("grade");
                int chinese = rs.getInt("chinese");
                int math = rs.getInt("math");
                int english = rs.getInt("english");
                int chemistry = rs.getInt("chemistry");
                int political = rs.getInt("political");
                int history = rs.getInt("history");
                int total_score = rs.getInt("total_score");
                String teacher_id = rs.getString("teacher_id");

                //创建student对象,并添加到ArrayList
                com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id_s, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
                //把teacher_id 改为 teacher 的name
                select_teacherByTeacher_id(student);

                students.add(student);
            }
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, null);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }




    /**
     * 通过姓名模糊查询 把学生数据库中的数据传递给学生表格(教师使用)
     * @param students
     * @param name_s
     * @param id_t
     */
    @Override
    public void select_studentTableByName_forTeacher(ArrayList<com.student_manageSystem.pojo.Student> students, String name_s, String id_t) {
        try {
            Connection conn = SQLUtils.getConnection();
            //先清空所有的数据
            students.clear();

            //模糊查询,多表查询,隐式内连接
            String sql = "select * from t_student_table s where s.name like '%' " + '?' + " '%' and s.teacher_id = ?; ";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name_s);
            pstmt.setString(2, id_t);
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                String id = rs.getString("id");
                String name2 = rs.getString("name");
                String pwd = rs.getString("pwd");
                String sex = rs.getString("sex");
                int grade = rs.getInt("grade");
                int chinese = rs.getInt("chinese");
                int math = rs.getInt("math");
                int english = rs.getInt("english");
                int chemistry = rs.getInt("chemistry");
                int political = rs.getInt("political");
                int history = rs.getInt("history");
                int total_score = rs.getInt("total_score");
                String teacher_id = rs.getString("teacher_id");

                //创建student对象,并添加到ArrayList
                com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name2, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
                //把teacher_id 改为 teacher 的name
                select_teacherByTeacher_id(student);

                students.add(student);
            }
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, null);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }






    /**
     * ----------------------------------------------------------------------------------------------------------
     */

    /**
     *  把学生数据库中的 所有  数据传递给学生表格(管理员使用)
     * @param students
     */
    @Override
    public void selectAll_studentTable_forManager(ArrayList<com.student_manageSystem.pojo.Student> students) {
        try {
            Connection conn = SQLUtils.getConnection();
            //先清空所有的数据
            students.clear();

            String sql = "select * from t_student_table";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                int grade = rs.getInt("grade");
                int chinese = rs.getInt("chinese");
                int math = rs.getInt("math");
                int english = rs.getInt("english");
                int chemistry = rs.getInt("chemistry");
                int political = rs.getInt("political");
                int history = rs.getInt("history");
                int total_score = rs.getInt("total_score");
                String teacher_id = rs.getString("teacher_id");


                //创建student对象,并添加到ArrayList
                com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
                //把teacher_id 改为 teacher 的name
                select_teacherByTeacher_id(student);

                students.add(student);
            }
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, conn);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 通过  ID查询  把学生数据库中的数据传递给学生表格(管理员使用)
     * @param students
     * @param id
     */
    @Override
    public void select_studentTableByID_forManager(ArrayList<com.student_manageSystem.pojo.Student> students, String id) {
        try {
            Connection conn = SQLUtils.getConnection();
            //先清空所有的数据
            students.clear();

            String sql = "select * from t_student_table where id = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            ResultSet rs = pstmt.executeQuery();

            //因为ID是唯一的,只有一个,所以不用使用while()
            if (rs.next()) {
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                int grade = rs.getInt("grade");
                int chinese = rs.getInt("chinese");
                int math = rs.getInt("math");
                int english = rs.getInt("english");
                int chemistry = rs.getInt("chemistry");
                int political = rs.getInt("political");
                int history = rs.getInt("history");
                int total_score = rs.getInt("total_score");
                String teacher_id = rs.getString("teacher_id");

                //创建student对象,并添加到ArrayList
                com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
                //把teacher_id 改为 teacher 的name
                select_teacherByTeacher_id(student);

                students.add(student);
            }
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, null);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }



    /**
     * 通过  年级查询  把学生数据库中的数据传递给学生表格(管理员使用)
     * @param students
     * @param grade
     */
    @Override
    public void select_studentTableByGrade_forManager(ArrayList<com.student_manageSystem.pojo.Student> students, int grade) {
        try {
            Connection conn = SQLUtils.getConnection();
            //先清空所有的数据
            students.clear();

            String sql = "select * from t_student_table where grade = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, grade);
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                int chinese = rs.getInt("chinese");
                int math = rs.getInt("math");
                int english = rs.getInt("english");
                int chemistry = rs.getInt("chemistry");
                int political = rs.getInt("political");
                int history = rs.getInt("history");
                int total_score = rs.getInt("total_score");
                String teacher_id = rs.getString("teacher_id");

                //创建student对象,并添加到ArrayList
                com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score,teacher_id);
                //把teacher_id 改为 teacher 的name
                select_teacherByTeacher_id(student);

                students.add(student);
            }
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, null);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }



    /**
     * 同时通过  ID和年级查询  把学生数据库中的数据传递给学生表格(管理员使用)
     * @param students
     * @param id
     * @param grade
     */
    @Override
    public void select_studentTableByIDAndGrade_forManager(ArrayList<com.student_manageSystem.pojo.Student> students, String id, int grade) {
        try {
            Connection conn = SQLUtils.getConnection();
            //先清空所有的数据
            students.clear();

            String sql = "select * from t_student_table where id = ? and grade = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.setInt(2, grade);

            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                int chinese = rs.getInt("chinese");
                int math = rs.getInt("math");
                int english = rs.getInt("english");
                int chemistry = rs.getInt("chemistry");
                int political = rs.getInt("political");
                int history = rs.getInt("history");
                int total_score = rs.getInt("total_score");
                String teacher_id = rs.getString("teacher_id");

                //创建student对象,并添加到ArrayList
                com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
                //把teacher_id 改为 teacher 的name
                select_teacherByTeacher_id(student);

                students.add(student);
            }
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, null);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }




    /**
     * 通过姓名模糊查询 把学生数据库中的数据传递给学生表格(管理员使用)
     * @param students
     * @param name
     */
    @Override
    public void select_studentTableByName_forManager(ArrayList<com.student_manageSystem.pojo.Student> students, String name) {
        try {
            Connection conn = SQLUtils.getConnection();
            //先清空所有的数据
            students.clear();

            //模糊查询
            String sql = "select * from t_student_table where name like '%' " + "?" + " '%'; ";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                String id = rs.getString("id");
                String name2 = rs.getString("name");
                String pwd = rs.getString("pwd");
                String sex = rs.getString("sex");
                int grade = rs.getInt("grade");
                int chinese = rs.getInt("chinese");
                int math = rs.getInt("math");
                int english = rs.getInt("english");
                int chemistry = rs.getInt("chemistry");
                int political = rs.getInt("political");
                int history = rs.getInt("history");
                int total_score = rs.getInt("total_score");
                String teacher_id = rs.getString("teacher_id");

                //创建student对象,并添加到ArrayList
                com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name2, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
                //把teacher_id 改为 teacher 的name
                select_teacherByTeacher_id(student);

                students.add(student);
            }
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, null);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }


}

TeacherImpl

package com.student_manageSystem.dao.impl;

import com.student_manageSystem.dao.TeacherDao;
import com.student_manageSystem.pojo.Teacher;
import com.student_manageSystem.utils.SQLUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;


/**
 * 教师的增删改查
 */
public class TeacherImpl implements TeacherDao {

    /**
     * 查询教师姓名,判断老师是否存在
     * @param name
     * @return
     */
    @Override
    public boolean judge_teacherNameIsExist(String name) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select * from t_teacher_table where name = ?";

        try {
            conn = SQLUtils.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            rs = pstmt.executeQuery();

            return rs.next();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //释放资源
            SQLUtils.closeResource(rs, pstmt, conn);
        }
    }




    /**
     * 查询教师ID,判断老师是否存在
     * @param id
     * @return
     */
    @Override
    public boolean judge_teacherIDIsExist(String id) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select * from t_teacher_table where id = ?";

        try {
            conn = SQLUtils.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            rs = pstmt.executeQuery();

            return rs.next();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //释放资源
            SQLUtils.closeResource(rs, pstmt, conn);
        }

    }



    /**
     * 判断教师的姓名和ID是否相对应
     * @param name
     * @param id_t
     * @return
     */
    @Override
    public boolean judgeTeacher_nameAndId(String name, String id_t) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select id from t_teacher_table where name = ?";

        try {
            conn = SQLUtils.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            rs = pstmt.executeQuery();

            String id = null;
            if (rs.next()) {
               id = rs.getString("id");
            }
            return id != null && id.equals(id_t);

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //释放资源
            SQLUtils.closeResource(rs, pstmt, conn);
        }

    }





    /**
     * 教师登录,查询ID和密码是否正确
     * @param id : id
     * @param pwd : 密码
     * @return
     */
    @Override
    public boolean teacher_log(String id, String pwd) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select * from t_teacher_table where id = ? && pwd = ?";

        try {
            conn = SQLUtils.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.setString(2, pwd);
            rs = pstmt.executeQuery();

            return rs.next();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(rs, pstmt, conn);
        }

    }



    /**
     * 增加教师
     * @param teacher
     */
    @Override
    public void insert_teacher(Teacher teacher) {
        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            conn = SQLUtils.getConnection();
            String sql = "insert into t_teacher_table values (?, ?, ?, ?, ?, ?, ?, ?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, teacher.getId());
            pstmt.setString(2, teacher.getPwd());
            pstmt.setString(3, teacher.getName());
            pstmt.setString(4, teacher.getSex());
            pstmt.setInt(5, teacher.getAge());
            pstmt.setString(6, teacher.getGraduate_school());
            pstmt.setInt(7, teacher.getSalary());
            pstmt.setString(8, teacher.getTelephone());

            int count = pstmt.executeUpdate();
            if (count > 0) System.out.println("成功注册或增加了一个教师");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(null, pstmt, conn);
        }
    }



    /**
     * 删除教师
     * @param id
     */
    @Override
    public void delete_teacher(String id) {
        try {
            Connection conn = SQLUtils.getConnection();
            String sql = "delete from t_teacher_table where id = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,id);
            int count = pstmt.executeUpdate();

            if (count > 0) System.out.println("成功删除了一位教师");
            SQLUtils.closeResource(null, pstmt, conn);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }





    /**
     * 更新教师
     * @param oldID
     * @param teacher
     */
    @Override
    public void update_teacher(String oldID, Teacher teacher){
        PreparedStatement pstmt = null;
        try {
            Connection conn = SQLUtils.getConnection();
            String sql = "update t_teacher_table set id=?, pwd=?, name=?, sex=?, age=?, graduate_school=?, salary=?, telephone=? where id = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, teacher.getId());
            pstmt.setString(2, teacher.getPwd());
            pstmt.setString(3, teacher.getName());
            pstmt.setString(4, teacher.getSex());
            pstmt.setInt(5, teacher.getAge());
            pstmt.setString(6, teacher.getGraduate_school());
            pstmt.setInt(7, teacher.getSalary());
            pstmt.setString(8, teacher.getTelephone());
            pstmt.setString(9,oldID);

            int count = pstmt.executeUpdate();
            if (count > 0) System.out.println("成功更新了教师数据");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(null, pstmt, null);
        }

    }



    /**
     * 把教师数据库中的 所有  数据传递给教师表格(和管理员登录后首先看到的教师表格有关,也和刷新按钮有关)
     * @param teachers
     */
    @Override
    public void selectAll_teacherTable(ArrayList<Teacher> teachers) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = SQLUtils.getConnection();
            //先清空所有的数据
            teachers.clear();

            String sql = "select * from t_teacher_table";
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                int age = rs.getInt("age");
                String graduate_school = rs.getString("graduate_school");
                int salary = rs.getInt("salary");
                String telephone = rs.getString("telephone");

                //创建teacher对象,并添加到ArrayList
                Teacher teacher = new Teacher(id, pwd, name, sex, age, graduate_school, salary, telephone);
                teachers.add(teacher);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, conn);
        }
    }






    /**
     * 通过  ID查询  把老师数据库中的数据传递给老师表格
     * @param teachers
     * @param id
     */
    @Override
    public void select_teacherTableByID(ArrayList<Teacher> teachers, String id) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = SQLUtils.getConnection();
            //先清空所有的数据
            teachers.clear();

            String sql = "select * from t_teacher_table where id = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            rs = pstmt.executeQuery();

            //因为ID是唯一的,只有一个,所以不用使用while()
            if (rs.next()) {
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                int age = rs.getInt("age");
                String graduate_school = rs.getString("graduate_school");
                int salary = rs.getInt("salary");
                String telephone = rs.getString("telephone");

                //创建teacher对象,并添加到ArrayList
                Teacher teacher = new Teacher(id, pwd, name, sex, age, graduate_school, salary, telephone);
                teachers.add(teacher);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //关闭资源
            SQLUtils.closeResource(rs, pstmt, conn);
        }

    }






    /**
     * 通过姓名模糊查询 把教师数据库中的数据传递给教师表格
     * @param teachers
     * @param name
     */
    @Override
    public void select_teacherTableByName(ArrayList<Teacher> teachers, String name) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = SQLUtils.getConnection();
            //先清空所有的数据
            teachers.clear();

            //模糊查询
            String sql = "select * from t_teacher_table where name like '%' " +  "?" + " '%'; ";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                //这里应该要获取一下name的值,因为我们是进行模糊查询,所以要获取一下完整的name值
                String name2 = rs.getString("name");
                String sex = rs.getString("sex");
                int age = rs.getInt("age");
                String graduate_school = rs.getString("graduate_school");
                int salary = rs.getInt("salary");
                String telephone = rs.getString("telephone");

                //创建teacher对象,并添加到ArrayList
                Teacher teacher = new Teacher(id, pwd, name2, sex, age, graduate_school, salary, telephone);
                teachers.add(teacher);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(rs, pstmt, conn);
        }

    }






    /**
     * 判断教师是否教的有学生(用于管理员删除教师,因为学生表和教师表添加了外键,不能随便删除教师)
     * @param id_t
     * @return
     */
    @Override
    public boolean judgeTeacher_havaStudents(String id_t) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select * from t_student_table where teacher_id = ?";

        try {
            conn = SQLUtils.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id_t);
            rs = pstmt.executeQuery();

            return rs.next();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            SQLUtils.closeResource(rs, pstmt, conn);
        }

    }

}

3)pojo文件夹

Student类

package com.student_manageSystem.pojo;

public class Student {
    String id;
    String pwd;
    String name;
    String sex;
    int grade;
    int chinese;
    int math;
    int english;
    int chemistry;
    int political;
    int history;
    int total_score;
    String teacher_id;

    public Student() {}

    public Student(String id, String pwd, String name, String sex, int grade, int chinese, int math, int english, int chemistry, int political, int history, int total_score, String teacher_id) {
        this.id = id;
        this.pwd = pwd;
        this.name = name;
        this.sex = sex;
        this.grade = grade;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
        this.chemistry = chemistry;
        this.political = political;
        this.history = history;
        this.total_score = total_score;
        this.teacher_id = teacher_id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    public int getChinese() {
        return chinese;
    }

    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    public int getMath() {
        return math;
    }

    public void setMath(int math) {
        this.math = math;
    }

    public int getEnglish() {
        return english;
    }

    public void setEnglish(int english) {
        this.english = english;
    }

    public int getChemistry() {
        return chemistry;
    }

    public void setChemistry(int chemistry) {
        this.chemistry = chemistry;
    }

    public int getPolitical() {
        return political;
    }

    public void setPolitical(int political) {
        this.political = political;
    }

    public int getHistory() {
        return history;
    }

    public void setHistory(int history) {
        this.history = history;
    }

    public int getTotal_score() {
        return total_score;
    }

    public void setTotal_score(int total_score) {
        this.total_score = total_score;
    }

    public String getTeacher_id() {
        return teacher_id;
    }

    public void setTeacher_id(String teacher_id) {
        this.teacher_id = teacher_id;
    }

    @Override
    public String toString() {
        String result = "Student{id:" + this.id + "," +
                "pwd:" + this.pwd + "," +
                "name:" + this.name + "," +
                "sex:" + this.sex + "," +
                "grade:" + this.grade + "," +
                "chinese:" + this.chinese + "," +
                "math:" + this.math + "," +
                "english:" + this.english + "," +
                "chemistry:" + this.chemistry + "," +
                "political:" + this.political + "," +
                "history:" + this.history + "," +
                "total_score:" + this.total_score + "," +
                "teacher_id:" + this.teacher_id + "}";
        return result;
    }
}

Teacher类

package com.student_manageSystem.pojo;

public class Teacher {
    String id;
    String pwd;
    String name;
    String sex;
    int age;
    String graduate_school;
    int salary;
    String telephone;

    public Teacher() {}

    public Teacher(String id, String pwd, String name, String sex, int age, String graduate_school, int salary, String telephone) {
        this.id = id;
        this.pwd = pwd;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.graduate_school = graduate_school;
        this.salary = salary;
        this.telephone = telephone;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGraduate_school() {
        return graduate_school;
    }

    public void setGraduate_school(String graduate_school) {
        this.graduate_school = graduate_school;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    @Override
    public String toString() {
        String result = "Teacher{id:" + this.id + "," +
                "pwd:" + this.pwd + "," +
                "name:" + this.name + "," +
                "sex:" + this.sex + "," +
                "age:" + this.age + "," +
                "graduate_school:" + this.graduate_school + "," +
                "salary:" + this.salary + "," +
                "telephone:" + this.telephone + "}";
        return result;
    }
}

4)utils文件夹

依照文件的顺序

package com.student_manageSystem.utils;

/**
 * 普通工具类
 */
public class CommonUtils {

    /**
     * 判断字符串是否可以转换为数字(用来查询使用)
     * @param str : 输入字符串;str为空时,返回false
     * @return : true.可以转换为数字;false.不可以
     */
    public static boolean isStrToNum(String str) {
        try {
            Integer.parseInt(str);//如果可以执行这行代码,就代表可以转换为数字,否则return false
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }



    /**
     * 判断数据是否在正确的区间(0<=每科成绩<=100;1<=年级<=4;班级>=0)
     * @param data : 数据的大小
     * @param min : 允许的最小值(包含最小值)
     * @param max: 允许的最大值(包含最大值)
     */
    public static boolean isDataSuitable(int data, int min, int max) {
        return data >= min && data <= max;
    }

}
package com.student_manageSystem.utils;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


/**
 * md5数据单向加密(不可逆加密,备注:数据库中的模版数据,如刘备,张飞等密码都是:111)
 */
public class MD5Utils {
  
    /**
     * 使用JDK自带MessageDigest
     * @param pwd
     * @return
     */
    public static String md5Encryption(String pwd) {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("md5");

            byte[] bytes = messageDigest.digest(pwd.getBytes("UTF-8"));
            //16是表示转换为16进制数
            String result = new BigInteger(1, bytes).toString(16);

            return result;

        } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

}
package com.student_manageSystem.utils;

import java.sql.*;

public class SQLUtils {
    //封装字符串常量
    public final static String URL = "_________";
    public final static String USER = "____";
    public final static String PASSWORD = "___";


    /**
     * 获取数据库连接对象
     * @return 返回数据库连接对象
     */
    public static Connection getConnection() {
        Connection conn = null;

        try {
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return conn;
    }



    /**
     * 关闭资源
     * @param rs
     * @param stmt
     * @param conn
     */
    public static void closeResource(ResultSet rs, Statement stmt, Connection conn) {
        try {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


}

 

package com.student_manageSystem.utils;

import com.student_manageSystem.Main;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;



/**
 * 视图工具类
 */
public class ViewUtils {

    /**
     * 设置GridPane布局的一些属性
     * @param gridPane : 网格布局
     */
    public static void setGridPane(GridPane gridPane) {
        //设置每个组件之间的间距
        gridPane.setHgap(10);//设置节点间的水平间距,也就是列与列的间距(节点就是组件)
        gridPane.setVgap(10);//节点间的垂直间距,也就是行与行的间距
        //设置组件在中间分布
        gridPane.setAlignment(Pos.CENTER);
        gridPane.setStyle("-fx-font-size: 18;");
    }


    /**
     * 设置VBox单列面板布局的一些属性
     * @param style : 字体类型
     * @param spacing : 间距
     * @param value : 设置组件的位置
     * @param children : 组件
     * @return : VBox
     */
    public static VBox getVBox(String style, int spacing, Pos value, Node... children) {
        VBox vBox = new VBox(children);
        //字体类型
        vBox.setStyle(style);
        //间距
        vBox.setSpacing(spacing);
        //设置组件的位置
        vBox.setAlignment(value);
        return vBox;
    }


    /**
     * 设置HBox单行面板布局的一些属性
     * @param style : 字体类型
     * @param spacing : 间距
     * @param value : 设置组件的位置
     * @param isSetBackground : true:说明需要设置背景颜色,是表格;false:不需要设置背景颜色
     * @param children : 组件
     * @return : HBox
     */
    public static HBox getHBox(String style, int spacing, Pos value, boolean isSetBackground, Node... children) {
        HBox hBox = new HBox(children);
        //字体类型
        hBox.setStyle(style);
        //间距
        hBox.setSpacing(spacing);
        //设置组件的位置
        hBox.setAlignment(value);

        //设置hBox的背景颜色
        if (isSetBackground) {
            hBox.setBackground(new Background(new BackgroundFill(Color.rgb(119, 168, 157), null, null)));
        }
        return hBox;
    }




    /**
     * 设置顶层窗口的一些属性
     * @param str : 标题的内容
     * @param tipStage : 需要添加属性的窗口
     */
    public static void setTopTip(String str, Stage tipStage) {
        tipStage.setResizable(false);//不能调整大小
        tipStage.setTitle(str);//设置标题
        //只能操作当前的提示框
        tipStage.initOwner(Main.stage);
        tipStage.initModality(Modality.WINDOW_MODAL);
        //设置该提示框永远在最上层
        tipStage.setAlwaysOnTop(true);
    }



    /**
     * 提示框
     * @param content : 提示的信息
     */
    public static void tips(String content) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        //调用顶层窗口函数设置一些必要的属性
        setTopTip(content, tipStage);

        Label label = new Label(content);
        Button back = new Button("返回");

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //单列面板
        VBox vBox = new VBox(label, back);
        vBox.setSpacing(10);
        vBox.setAlignment(Pos.CENTER);

        Scene scene = new Scene(vBox, 180, 130);
        tipStage.setScene(scene);
        tipStage.show();
    }




}

Main

package com.student_manageSystem;

import com.student_manageSystem.dao.impl.StudentImpl;
import com.student_manageSystem.dao.impl.TeacherImpl;
import com.student_manageSystem.dao.StudentDao;
import com.student_manageSystem.dao.TeacherDao;
import com.student_manageSystem.pojo.Student;
import com.student_manageSystem.utils.CommonUtils;
import com.student_manageSystem.utils.MD5Utils;
import com.student_manageSystem.utils.ViewUtils;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.util.ArrayList;



/**
 * @projectName : student_manage_system
 * @className : Main
 * @description : 系统与用户交互界面
 * @author : lizhuang
 * @createDate : 10.19
 */
public class Main extends Application {
    //新添加:
    //1.限制每个教师只能查到自己的学生
    //2.传入学生,教师的参数时,由于参数较多,要封装到一个学生,教师对象中
    //3.输入学号,姓名时,在首尾输入空格无影响
    //4.对学生的密码进行MD5加密(不可逆加密)


    //更新:
    //密码框


    public static Stage stage;

    //多态调用
    static StudentDao studentDao = new StudentImpl();
    static TeacherDao teacherDao = new TeacherImpl();






    /**
     * 主入口
     */
    public static void main(String[] args) {
        launch(args);
    }


    @Override
    public void start(Stage stage) {
        Main.stage = stage;
        stage.setResizable(false);

        begin();
        stage.show();
    }


    /**
     * 首页面
     */
    public static void begin() {
        GridPane gridPane = new GridPane();
        stage.setTitle("学生管理系统首页");
        //设置gridPane 的一些属性
        ViewUtils.setGridPane(gridPane);

        Button manageLog = new Button("管理员登录");
        Button teacherLog = new Button("教师登录");
        Button studentLog = new Button("学生登录");
        Button studentSign = new Button("学生注册");

        //点击管理员登录按钮
        manageLog.setOnAction(actionEvent -> {
            Manager_operate.managerLog();
        });

        //点击老师登录按钮
        teacherLog.setOnAction(actionEvent -> {
            teacher_log();
        });

        //点击学生登录按钮
        studentLog.setOnAction(actionEvent -> {
            student_log();
        });

        //点击学生注册按钮
        studentSign.setOnAction(actionEvent -> {
            student_sign();
        });

        VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 20, Pos.CENTER, manageLog, teacherLog, studentLog, studentSign);
        Scene scene = new Scene(vBox, 500, 400);
        stage.setScene(scene);
    }






    /**
     * 学生的一些操作
     * ------------------------------------------------------------------------------------------------------------------------
     * 学生注册
     */
    public static void student_sign() {
        stage.setTitle("学生注册");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);//设置GridPane的一些属性

        Label id = new Label("学生学号");
        TextField idTxt = new TextField();
        Label pwd = new Label("学生密码");
        PasswordField pwdFld = new PasswordField();
        Label name = new Label("学生姓名");
        TextField nameTxt = new TextField();
        Label sex = new Label("性别");
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        Label grade = new Label("学生年级");
        TextField gradeTxt = new TextField();
        Label teacher_id = new Label("教师姓名");
        TextField teacher_idTxt = new TextField();
        Button sign = new Button("注册");
        Button back = new Button("返回");

        //点击注册按钮
        sign.setOnAction(actionEvent -> {
            //数据要符合规范,grade,classSchool成绩必须是数字的形式,并且1<=grade<=4,0<=成绩<=100,ID必须没有重复
            //数据是否为空
            boolean isEmpty = !idTxt.getText().trim().equals("") && !pwdFld.getText().trim().equals("") && !nameTxt.getText().trim().equals("")
                    && (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().trim().equals("");

            //部分数据的范围是否合适
            boolean isSuitable =  !gradeTxt.getText().trim().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText().trim()), 1, 4);
            boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText().trim()) && !studentDao.judge_StudentIDIsExist(idTxt.getText().trim());

            //要注册的学生ID不能存在,学生的教师姓名必须是存在的
            if (isEmpty && isSuitable && isSuitable2) {
                String sexDemo = man.isSelected() ? "男" : "女";

                studentDao.insert_student(idTxt.getText().trim(), pwdFld.getText().trim(), nameTxt.getText().trim(), sexDemo, Integer.parseInt(gradeTxt.getText().trim()), teacher_idTxt.getText().trim());
                ViewUtils.tips("注册成功");
                begin();//注册成功后返回到主页面

            } else if (!isSuitable2) {
                ViewUtils.tips("请检查教师姓名或学生ID");
            } else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击取消按钮,返回首页面
        back.setOnAction(actionEvent -> {
            begin();
        });

        //将男,女单选添加到单行面板中
        HBox hBox = new HBox(man, woman);

        gridPane.add(id, 0, 0);
        gridPane.add(idTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdFld, 1, 1);
        gridPane.add(name, 0, 2);
        gridPane.add(nameTxt, 1, 2);
        gridPane.add(sex, 0, 3);
        gridPane.add(hBox, 1, 3);
        gridPane.add(grade, 0, 4);
        gridPane.add(gradeTxt, 1, 4);
        gridPane.add(teacher_id, 0, 5);
        gridPane.add(teacher_idTxt, 1, 5);
        gridPane.add(sign, 0, 7);
        gridPane.add(back, 1, 7);

        //设置性别只能选择一个
        //将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
        ToggleGroup toggleGroup = new ToggleGroup();
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 500, 400);
        stage.setScene(scene);
    }



    /**
     * 学生登录页面
     */
    public static void student_log() {
        stage.setTitle("学生登录");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label idLabel = new Label("学生学号");
        TextField idTxt = new TextField();
        Label pwdLabel = new Label("学生密码");
        PasswordField pwdFld = new PasswordField();
        Button log = new Button("登录");
        Button back = new Button("返回");

        //点击登录
        log.setOnAction(actionEvent -> {
            try {
                if (studentDao.student_log(idTxt.getText().trim(), pwdFld.getText().trim())) {
                    //进入学生选项(trim()去掉字符串两端的空格)
                    student_select(idTxt.getText().trim(), pwdFld.getText().trim());
                }else {
                    ViewUtils.tips("请检查数据");
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });

        //点击取消
        back.setOnAction(actionEvent -> {
            begin();
        });


        //安排每个组件的位置
        gridPane.add(idLabel, 0, 0);
        gridPane.add(idTxt, 1, 0);
        gridPane.add(pwdLabel, 0, 1);
        gridPane.add(pwdFld, 1, 1);
        gridPane.add(log, 0, 3);
        gridPane.add(back, 1, 3);

        Scene scene = new Scene(gridPane, 500, 400);
        stage.setScene(scene);
    }




    /**
     * 学生登录后选择选项
     * @param id : 传入ID用来查看学生分数 或 修改学生信息
     * @param pwd : 传入ID用来查看学生分数 或 修改学生信息
     */
    public static void student_select(String id, String pwd) {
        stage.setTitle("学生选择");
        Button checkScore = new Button("查看分数");
        Button update = new Button("修改信息");
        Button back = new Button("返回");

        //点击查看分数
        checkScore.setOnAction(actionEvent -> {
            student_checkScore(id, pwd);
        });

        //点击修改信息
        update.setOnAction(actionEvent -> {
            student_modify(id, pwd);
        });

        //点击取消
        back.setOnAction(actionEvent -> {
            begin();
        });

        VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 20, Pos.CENTER, checkScore, update, back);
        Scene scene = new Scene(vBox, 500, 400);
        stage.setScene(scene);
    }



    /**
     * 学生查看分数页面
     * @param id : 传入学生ID
     * @param pwd : 点击取消时,将ID和p 传入到student_select方法中
     */
    public static void student_checkScore(String id, String pwd) {
        stage.setTitle("学生查询成绩");

        String encryption_pwd = MD5Utils.md5Encryption(pwd);
        Student student =  studentDao.select_studentByOneself(id, encryption_pwd);

        Label id2 = new Label("学号 :  " + student.getId());
        Label p2 = new Label("密码 :  " + pwd);
        Label name = new Label("姓名 :  " + student.getName());
        Label sex = new Label("性别 :  " + student.getSex());
        Label grade = new Label("年级 :  " + student.getGrade());
        Label chinese = new Label("语文 :  " + student.getChinese());
        Label math = new Label("数学 :  " + student.getMath());
        Label english = new Label("英语 :  " + student.getEnglish());
        Label chemistry = new Label("化学 :  " + student.getChemistry());
        Label political = new Label("政治 :  " + student.getPolitical());
        Label history = new Label("历史 :  " + student.getHistory());
        Label total_score = new Label("总分 :  " + student.getTotal_score());
        Label teacher_id = new Label("教师姓名 :  " + student.getTeacher_id());
        Button back = new Button("返回");

        //点击返回按钮,返回首页面
        back.setOnAction(actionEvent -> {
            student_select(id, pwd);
        });

        //单列面板
        VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 10, Pos.CENTER,id2, p2, name, sex, grade,  chinese, math, english, chemistry, political, history, total_score, teacher_id, back);
        Scene scene = new Scene(vBox, 300, 530);
        stage.setScene(scene);
    }



    /**
     * 学生修改自己的信息
     * @param id : 通过ID来搜索到我们要修改的学生
     * @param p : 点击取消时,将ID和p 传入到student_select方法中
     */
    public static void student_modify(String id, String p) {
        stage.setTitle("学生修改信息");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        //修改自己数据的时候把数据填充一下
        String encryption_pwd = MD5Utils.md5Encryption(p);
        Student student = studentDao.select_studentByOneself(id, encryption_pwd);

        Label pwd = new Label("学生密码");
        TextField pwdTxt = new TextField(p);
        Label name = new Label("学生姓名");
        TextField nameTxt = new TextField(student.getName());
        Label sex = new Label("性别");
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        if (student.getSex().equals("男")) {
            man.setSelected(true);
        } else if (student.getSex().equals("女")) {
            woman.setSelected(true);
        }
        Label grade = new Label("学生年级");
        TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
        Label teacher_id = new Label("教师姓名");
        TextField teacher_idTxt = new TextField(student.getTeacher_id());
        Button modify = new Button("修改");
        Button back = new Button("返回");


        //点击修改
        modify.setOnAction(actionEvent -> {
            //数据要符合规范,grade,classSchool,成绩必须是数字的形式,并且1<=grade<=4,0<=成绩<=100,ID必须没有重复;教师必须存在
            boolean isEmpty = !pwdTxt.getText().equals("")  && !nameTxt.getText().equals("") && (man.isSelected() ||
                    woman.isSelected()) && !teacher_idTxt.getText().equals("");
            boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
            boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
            boolean isExists = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText());

            if (isEmpty && isNum && isSuitable && isExists) {
                String sexDemo = man.isSelected() ? "男" : "女";

                //教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
                studentDao.update_studentByOneself(id, pwdTxt.getText(), nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()), studentDao.replaceName_withId(teacher_idTxt.getText()));

                ViewUtils.tips("修改成功");
                student_select(id, pwdTxt.getText());
            }else if (!isExists) {
                ViewUtils.tips("请检查该教师是否存在");
            }else {
                ViewUtils.tips("请检查数据");
            }

        });

        //点击取消按钮,返回首页面
        back.setOnAction(actionEvent -> {
            student_select(id, p);
        });

        //将男,女单选添加到单行面板中
        HBox hBox = new HBox(man, woman);

        gridPane.add(pwd, 0, 0);
        gridPane.add(pwdTxt, 1, 0);
        gridPane.add(name, 0, 1);
        gridPane.add(nameTxt, 1, 1);
        gridPane.add(sex, 0, 2);
        gridPane.add(hBox, 1, 2);
        gridPane.add(grade, 0, 3);
        gridPane.add(gradeTxt, 1, 3);
        gridPane.add(teacher_id, 0, 4);
        gridPane.add(teacher_idTxt, 1, 4);
        gridPane.add(modify, 0, 6);
        gridPane.add(back, 1, 6);

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 500, 400);
        stage.setScene(scene);
    }







    /**
     * 教师的相关操作
     * ------------------------------------------------------------------------------------------------------------------------
     * 教师登录
     */
    public static void teacher_log() {
        stage.setTitle("教师登录");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label teacherID = new Label("教师工号");
        TextField teacherIDTxt = new TextField();
        Label pwd = new Label("教师密码");
        PasswordField pwdFld = new PasswordField();
        Button log = new Button("登录");
        Button cancel = new Button("取消");

        //点击登录按钮
        log.setOnAction(actionEvent -> {
            if (teacherDao.teacher_log(teacherIDTxt.getText().trim(), pwdFld.getText().trim())) {
                manageStudent(true, teacherIDTxt.getText().trim());
            }else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击取消按钮,返回首页面
        cancel.setOnAction(actionEvent -> {
            begin();
        });

        gridPane.add(teacherID, 0, 0);
        gridPane.add(teacherIDTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdFld, 1, 1);
        gridPane.add(log, 0, 2);
        gridPane.add(cancel, 1, 2);

        Scene scene = new Scene(gridPane, 500, 400);
        stage.setScene(scene);
    }






    /**
     * 教师,管理员管理学生
     * @param select : true.老师管理学生;false.管理员管理学生(因为老师和管理员的返回界面不同,所以要分两种情况)
     */
    public static void manageStudent(boolean select, String id_t) {
        //学生集合
        ArrayList<Student> students = new ArrayList<>();

        stage.setTitle("管理学生");
        BorderPane borderPane = new BorderPane();

        Button add = new Button("增加");
        Button delete = new Button("删除");
        Button update = new Button("修改");
        Button query = new Button("查询");
        Button refresh = new Button("刷新");
        Button back = new Button("返回");

        //点击增加学生
        add.setOnAction(actionEvent -> {
            if (select) {
                Teacher_operate.addStudent(borderPane, students, id_t);
            }else {
                Manager_operate.addStudent_forManager(borderPane, students);
            }
        });

        //点击删除学生
        delete.setOnAction(actionEvent -> {
            //删除学生和管理员删除老师的界面相同
            //删除学生,true:删除学生,false:删除老师
            if (select) {
                Teacher_operate.deletePerson(borderPane, students, id_t);
            }else {
                Manager_operate.deletePerson(borderPane, students, null, true);
            }
        });

        //点击修改学生
        update.setOnAction(actionEvent -> {
            //先输入ID号码判断是否存在该学生,如果存在就修改学生
            //true.老师或管理员修改学生;false.管理员修改老师
            if (select) {
                Teacher_operate.inputID(borderPane, students, id_t);
            }else {
                Manager_operate. inputID(borderPane, students, null, true);
            }

        });

        //点击查询学生
        query.setOnAction(actionEvent -> {
            if (select) {
                Teacher_operate.queryStudent_byTeacher(borderPane, students, id_t);
            }else {
                Manager_operate.queryStudent_forManager(borderPane, students);
            }
        });

        //点击刷新
        refresh.setOnAction(actionEvent -> {
            if (select) {
                Teacher_operate.refresh_studentTable_forTeacher(borderPane, students, id_t);
            }else {
                Manager_operate.refresh_studentTable_forManager(borderPane, students);
            }

        });

        //点击返回
        back.setOnAction(actionEvent -> {
            //教师退出该页面
            if (select) {
                begin();
            }else  {
                //管理员退出该页面
                Manager_operate.managerSelect();
            }
        });

        //单行面板
        HBox hBox = ViewUtils.getHBox("-fx-font-size: 18;", 40, Pos.CENTER, true, add, delete, update, query, refresh, back);
        //设置borderPane的背景颜色
        borderPane.setBackground(new Background(new BackgroundFill(Color.rgb(200, 200, 200),null,null)));//设置hBox的背景颜色
        //设置返回按钮的外边距
        hBox.setMargin(back, new Insets(20, 20, 20, 60));

        //将hBox 单行面板 添加到边界布局的顶部
        borderPane.setTop(hBox);

        //从数据库中把学生数据全部填写到students集合中
        if (select) {//教师查询学生
            studentDao.selectAll_studentTable_forTeacher(students, id_t);
        }else {
            studentDao.selectAll_studentTable_forManager(students);
        }

        //展示学生表格
        studentTable(borderPane, students);
        stage.setScene(new Scene(borderPane,1042, 500));
    }







    /**
     * 学生表格(通用:适合教师和管理员对学生的管理)
     * @param borderPane : 边界布局
     * @param students : 学生集合
     */
    public static void studentTable(BorderPane borderPane, ArrayList<Student> students) {
        //学生的信息表格
        TableView<Student> tableView = new TableView<>();

        //TableColumn类 创建列。然后使用TableView 类的 getColumns()方法将创建的列添加到表中。
        TableColumn id = new TableColumn<>("学号");
        TableColumn pwd = new TableColumn<>("密码");
        TableColumn name = new TableColumn<>("姓名");
        TableColumn sex = new TableColumn<>("性别");
        TableColumn grade = new TableColumn<>("年级");
        TableColumn chinese = new TableColumn<>("语文");
        TableColumn math = new TableColumn<>("数学");
        TableColumn english = new TableColumn<>("英语");
        TableColumn chemistry = new TableColumn<>("化学");
        TableColumn political = new TableColumn<>("政治");
        TableColumn history = new TableColumn<>("历史");
        TableColumn total_score = new TableColumn<>("总分");
        TableColumn teacher_id = new TableColumn<>("教师");

        //表格列宽宽度设置
        id.setMinWidth(70);
        pwd.setMinWidth(70);
        name.setMinWidth(60);
        sex.setMinWidth(60);
        grade.setMinWidth(60);
        chinese.setMinWidth(60);
        math.setMinWidth(60);
        english.setMinWidth(60);
        chemistry.setMinWidth(60);
        political.setMinWidth(60);
        history.setMinWidth(60);
        total_score.setMinWidth(60);
        teacher_id.setMinWidth(70);

        //确定数据导入的列
        id.setCellValueFactory(new PropertyValueFactory<>("id"));
        pwd.setCellValueFactory(new PropertyValueFactory<>("pwd"));
        name.setCellValueFactory(new PropertyValueFactory<>("name"));
        sex.setCellValueFactory(new PropertyValueFactory<>("sex"));
        grade.setCellValueFactory(new PropertyValueFactory<>("grade"));
        chinese.setCellValueFactory(new PropertyValueFactory<>("chinese"));
        math.setCellValueFactory(new PropertyValueFactory<>("math"));
        english.setCellValueFactory(new PropertyValueFactory<>("english"));
        chemistry.setCellValueFactory(new PropertyValueFactory<>("chemistry"));
        political.setCellValueFactory(new PropertyValueFactory<>("political"));
        history.setCellValueFactory(new PropertyValueFactory<>("history"));
        total_score.setCellValueFactory(new PropertyValueFactory<>("total_score"));
        teacher_id.setCellValueFactory(new PropertyValueFactory<>("teacher_id"));

        //将列添加到表格中
        tableView.getColumns().addAll(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);

        //将学生数组集合添加到表格中
        tableView.getItems().addAll(students);

        //将表格添加到边界布局的正中心
        borderPane.setCenter(tableView);
    }



}



Manager_operate

package com.student_manageSystem;

import com.student_manageSystem.dao.impl.ManagerImpl;
import com.student_manageSystem.dao.impl.StudentImpl;
import com.student_manageSystem.dao.impl.TeacherImpl;
import com.student_manageSystem.pojo.Student;
import com.student_manageSystem.pojo.Teacher;
import com.student_manageSystem.utils.CommonUtils;
import com.student_manageSystem.utils.ViewUtils;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.util.ArrayList;


/**
 * 管理员操作学生、教师;管理员自身的一些操作
 */
public class Manager_operate {
    private static final StudentImpl studentDao = new StudentImpl();
    private static final TeacherImpl teacherDao = new TeacherImpl();
    private static final ManagerImpl managerDao = new ManagerImpl();


    /**
     * 关于管理员的操作
     * ------------------------------------------------------------------------------------------------------------------------
     * 管理员登录
     */
    public static void managerLog() {
        Main.stage.setTitle("管理员登录");
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label id = new Label("管理员ID");
        TextField idTxt = new TextField();
        Label pwd = new Label("管理员密码");
        PasswordField pwdFld = new PasswordField();
        Button log = new Button("登录");
        Button cancel = new Button("取消");

        //点击登录按钮
        log.setOnAction(actionEvent -> {
            if (managerDao.manager_log(idTxt.getText().trim(), pwdFld.getText().trim())) {
                managerSelect();
            }else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击取消按钮,返回首页面
        cancel.setOnAction(actionEvent -> {
            Main.begin();
        });

        gridPane.add(id, 0, 0);
        gridPane.add(idTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdFld, 1, 1);
        gridPane.add(log, 0, 2);
        gridPane.add(cancel, 1, 2);

        Scene scene = new Scene(gridPane, 500, 400);
        Main.stage.setScene(scene);
    }



    /**
     * 管理员登录后的 选择
     */
    public static void managerSelect() {
        Main.stage.setTitle("管理员选项");
        Button manageStudent = new Button("管理学生");
        Button manageTeacher = new Button("管理教师");
        Button dataStatistical = new Button("成绩统计");
        Button back = new Button("退出系统");

        //点击管理学生按钮
        manageStudent.setOnAction(actionEvent -> {
            Main.manageStudent(false, null);
        });

        //点击管理教师按钮
        manageTeacher.setOnAction(actionEvent -> {
            manageTeacher();
        });

        //点击成绩统计
        dataStatistical.setOnAction(actionEvent -> {
            dataStatistical();
        });

        //点击退出按钮
        back.setOnAction(actionEvent -> {
            Main.begin();
        });

        //单行面板
        VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 40, Pos.CENTER, manageStudent, manageTeacher, dataStatistical, back);
        Main.stage.setScene(new Scene(vBox, 500, 400));
    }








    /**
     * 管理员增加学生
     * @param borderPane : 边界布局
     * @param students : 学生集合
     */
    public static void addStudent_forManager(BorderPane borderPane, ArrayList<Student> students) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();

        ViewUtils.setTopTip("增加学生",tipStage);
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label studentID = new Label("学生学号");
        TextField studentIDTxt = new TextField();
        Label pwd = new Label("学生密码");
        TextField pwdTxt = new TextField();
        Label name = new Label("学生姓名");
        TextField nameTxt = new TextField();
        Label sex = new Label("性别");
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        Label grade = new Label("学生年级");
        TextField gradeTxt = new TextField();
        Label teacher_id = new Label("教师姓名");
        TextField teacher_idTxt = new TextField();
        Button add = new Button("增加");
        Button back = new Button("返回");
        //单行面板
        HBox hBox = new HBox(man, woman);

        gridPane.add(studentID, 0, 0);
        gridPane.add(studentIDTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdTxt, 1, 1);
        gridPane.add(name, 0, 2);
        gridPane.add(nameTxt, 1, 2);
        gridPane.add(sex, 0, 3);
        gridPane.add(hBox, 1, 3);
        gridPane.add(grade, 0, 4);
        gridPane.add(gradeTxt, 1, 4);
        gridPane.add(teacher_id, 0, 6);
        gridPane.add(teacher_idTxt, 1, 6);
        gridPane.add(add, 0, 8);
        gridPane.add(back, 1, 8);

        //点击增加学生
        add.setOnAction(actionEvent -> {
            //数据要符合规范
            boolean isEmpty = !studentIDTxt.getText().equals("") && !pwdTxt.getText().equals("")  && !nameTxt.getText().equals("")
                    && (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().equals("");
            boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
            boolean isSuitable = !gradeTxt.getText().equals("") &&  CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
            //要判断教师的姓名是否存在,而不是教师ID,教师姓名要存在;学生学号不能存在
            boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && !studentDao.judge_StudentIDIsExist(studentIDTxt.getText());

            try {
                //学生ID不能重复;学生修改的教师必须存在
                if (isEmpty && isNum && isSuitable && isSuitable2) {
                    String sexDemo = man.isSelected() ? "男" : "女";

                    studentDao.insert_student(studentIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo,
                            Integer.parseInt(gradeTxt.getText()), teacher_idTxt.getText());

                    ViewUtils.tips("增加成功");
                    tipStage.close();
                    //刷新表格中的数据
                    refresh_studentTable_forManager(borderPane, students);

                }else if (!isSuitable2) {
                    ViewUtils.tips("请检查教师姓名或学生ID");
                }else {
                    ViewUtils.tips("请检查数据");
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 340, 400);
        tipStage.setScene(scene);
        tipStage.show();
    }



    /**
     * 删除学生或者老师
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param teachers : 教师集合
     * @param b : true删除学生,false删除老师
     */
    public static void deletePerson(BorderPane borderPane, ArrayList<Student> students, ArrayList<Teacher> teachers, boolean b) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("删除人员", tipStage);
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label ID = new Label("ID号码 :  ");
        TextField IDTxt = new TextField();
        Button delete = new Button("删除");
        Button back = new Button("返回");

        gridPane.add(ID, 0, 0);
        gridPane.add(IDTxt, 1, 0);
        gridPane.add(delete, 0, 2);
        gridPane.add(back, 1, 2);

        //点击删除按钮
        delete.setOnAction(actionEvent -> {

            try {
                //删除学生,先判断是否存在该学生
                if (b && studentDao.judge_StudentIDIsExist(IDTxt.getText())) {
                    studentDao.delete_student(IDTxt.getText());
                    ViewUtils.tips("成功删除该学生");
                    tipStage.close();
                    //刷新表格中的数据
                    refresh_studentTable_forManager(borderPane, students);

                }else if (!b && teacherDao.judge_teacherIDIsExist(IDTxt.getText()) && !teacherDao.judgeTeacher_havaStudents(IDTxt.getText())) {  //删除老师,先判断是否存在该老师,而且该教师没有教学生
                    teacherDao.delete_teacher(IDTxt.getText());
                    ViewUtils.tips("成功删除该老师");
                    tipStage.close();
                    //刷新表格中的数据
                    refresh_teacherTable(borderPane, teachers);
                } else if (!b && teacherDao.judgeTeacher_havaStudents(IDTxt.getText())) {
                    ViewUtils.tips("请确保该教师没有教授学生");
                } else {
                    ViewUtils.tips("请检查数据");
                }

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 360, 200);
        tipStage.setScene(scene);
        tipStage.show();
    }





    /**
     * 教师或管理员修改学生,管理员修改教师:必须先输入正确的ID号码后,才能修改
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param teachers : 教师集合
     * @param select : true.管理员修改学生;false.管理员修改老师
     */
    public static void inputID(BorderPane borderPane, ArrayList<Student> students, ArrayList<Teacher> teachers, boolean select) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("搜索ID号码", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label ID = new Label("ID号码 :  ");
        TextField IDTxt = new TextField();
        Button search = new Button("搜索");
        Button back = new Button("返回");

        gridPane.add(ID, 0, 0);
        gridPane.add(IDTxt, 1, 0);
        gridPane.add(search, 0, 2);
        gridPane.add(back, 1, 2);

        //点击搜索按钮
        search.setOnAction(actionEvent -> {
            try {
                //修改学生,先查询该学生是否存在
                if (select && studentDao.judge_StudentIDIsExist(IDTxt.getText())) {
                    updateStudent(borderPane, students, IDTxt.getText());
                    tipStage.close();

                }else if(!select && teacherDao.judge_teacherIDIsExist(IDTxt.getText())) {  //修改老师,先查询该老师是否存在
                    updateTeacher(borderPane, teachers, IDTxt.getText());
                    tipStage.close();

                }else {
                    ViewUtils.tips("请检查数据");
                }

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 360, 200);
        tipStage.setScene(scene);
        tipStage.show();
    }




    /**
     * 输入正确的ID号码后,可以修改学生了(学生的密码无法修改)
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param ID : 需要修改的学生的 原来的ID号码,我们要根据原来的ID来查找这个学生
     */
    public static void updateStudent(BorderPane borderPane, ArrayList<Student> students, String ID) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("修改学生", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        //先查询这个学生
        studentDao.select_studentTableByID_forManager(students, ID);
        Student student = students.get(0);


        Label studentID = new Label("学号 :  ");
        TextField studentIDTxt = new TextField(student.getId());
        Label name = new Label("姓名 :  " );
        TextField nameTxt = new TextField(student.getName());
        Label sex = new Label("性别 :  " );
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        if (student.getSex().equals("男")) {
            man.setSelected(true);
        } else if (student.getSex().equals("女")) {
            woman.setSelected(true);
        }
        Label grade = new Label("年级 :  ");
        TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
        Label chinese = new Label("语文 :  " );
        TextField chineseTxt = new TextField(String.valueOf(student.getChinese()));
        Label math = new Label("数学 :  " );
        TextField mathTxt = new TextField(String.valueOf(student.getMath()));
        Label english = new Label("英语 :  " );
        TextField englishTxt = new TextField(String.valueOf(student.getEnglish()));
        Label chemistry = new Label("化学 :  " );
        TextField chemistryTxt = new TextField(String.valueOf(student.getChemistry()));
        Label political = new Label("政治 :  " );
        TextField politicalTxt = new TextField(String.valueOf(student.getPolitical()));
        Label history = new Label("历史 :  " );
        TextField historyTxt = new TextField(String.valueOf(student.getHistory()));
        Label teacher_id = new Label("教师 :  " );
        TextField teacher_idTxt = new TextField(student.getTeacher_id());
        Button update = new Button("修改");
        Button back = new Button("返回");

        //单行面板
        HBox hBox = new HBox(man, woman);

        gridPane.add(studentID, 0, 0);
        gridPane.add(studentIDTxt, 1, 0);
        gridPane.add(name, 0, 1);
        gridPane.add(nameTxt, 1, 1);
        gridPane.add(sex, 0, 2);
        gridPane.add(hBox, 1, 2);
        gridPane.add(grade, 0, 3);
        gridPane.add(gradeTxt, 1, 3);
        gridPane.add(chinese, 0, 4);
        gridPane.add(chineseTxt, 1, 4);
        gridPane.add(math, 0, 5);
        gridPane.add(mathTxt, 1, 5);
        gridPane.add(english, 0, 6);
        gridPane.add(englishTxt, 1, 6);
        gridPane.add(chemistry, 0, 7);
        gridPane.add(chemistryTxt, 1, 7);
        gridPane.add(political, 0, 8);
        gridPane.add(politicalTxt, 1, 8);
        gridPane.add(history, 0, 9);
        gridPane.add(historyTxt, 1, 9);
        gridPane.add(teacher_id, 0, 10);
        gridPane.add(teacher_idTxt, 1, 10);
        gridPane.add(update, 0, 12);
        gridPane.add(back, 1, 12);

        //点击修改按钮
        update.setOnAction(actionEvent -> {
            //是否为空
            boolean isData = !studentIDTxt.getText().equals("") && !nameTxt.getText().equals("") && (man.isSelected() || woman.isSelected());
            //其中的班级和分数是否可以转换为数字
            boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText()) && CommonUtils.isStrToNum(chineseTxt.getText()) && CommonUtils.isStrToNum(mathTxt.getText()) &&
                    CommonUtils.isStrToNum(englishTxt.getText()) && CommonUtils.isStrToNum(chemistryTxt.getText()) && CommonUtils.isStrToNum(politicalTxt.getText()) &&
                    CommonUtils.isStrToNum(historyTxt.getText());
            //数据是否合适
            boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4) &&
                    !chineseTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chineseTxt.getText()), 0, 100) &&
                    !mathTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(mathTxt.getText()), 0, 100) &&
                    !englishTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(englishTxt.getText()), 0, 100) &&
                    !chemistryTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chemistryTxt.getText()), 0, 100) &&
                    !politicalTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(politicalTxt.getText()), 0, 100) &&
                    !historyTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(historyTxt.getText()), 0, 100);
            //判断该教师是否存在;判断新修改的学生ID是否已经被占有了
            boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && (!studentDao.judge_StudentIDIsExist(studentIDTxt.getText()) || studentIDTxt.getText().equals(ID));

            try {
                //数据正常
                if (isData && isNum && isSuitable && isSuitable2){
                    String sexDemo = man.isSelected() ? "男" : "女";
                    int totalScore = Integer.parseInt(chineseTxt.getText()) + Integer.parseInt(mathTxt.getText()) + Integer.parseInt(englishTxt.getText()) +
                            Integer.parseInt(chemistryTxt.getText()) + Integer.parseInt(politicalTxt.getText()) + Integer.parseInt(historyTxt.getText());

                    //把数据封装到Student对象中,传入到函数
                    Student student1 = new Student(studentIDTxt.getText(), "", nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()),
                            Integer.parseInt(chineseTxt.getText()), Integer.parseInt(mathTxt.getText()), Integer.parseInt(englishTxt.getText()), Integer.parseInt(chemistryTxt.getText()),
                            Integer.parseInt(politicalTxt.getText()), Integer.parseInt(historyTxt.getText()), totalScore, studentDao.replaceName_withId(teacher_idTxt.getText()));

                    //教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
                    //修改学生信息
                    studentDao.update_studentByTeacherAndManager(ID, student1);

                    ViewUtils.tips("修改成功");
                    tipStage.close();
                    //刷新表格中的数据
                    refresh_studentTable_forManager(borderPane, students);
                }else  {
                    ViewUtils.tips("请检查数据");
                }

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();
        //将单选按钮添加到到ToggleGroup对象,ToggleGroup对象将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 440, 680);
        tipStage.setScene(scene);
        tipStage.show();
    }





    /**
     * 管理员查询学生
     * @param borderPane : 边界布局
     * @param students : 学生集合
     */
    public static void queryStudent_forManager(BorderPane borderPane, ArrayList<Student> students) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("可以进行ID查询、班级查询、ID和班级共同查询、姓名模糊查询", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label studentID = new Label("学号 :  ");
        TextField studentIDTxt = new TextField();
        Label grade = new Label("年级 :  ");
        TextField gradeTxt = new TextField();
        Label name = new Label("姓名 :  ");
        TextField nameTxt = new TextField();
        Button query = new Button("查询");
        Button back = new Button("返回");

        gridPane.add(studentID, 0, 0);
        gridPane.add(studentIDTxt, 1, 0);
        gridPane.add(grade, 0, 1);
        gridPane.add(gradeTxt, 1, 1);
        gridPane.add(name, 0, 2);
        gridPane.add(nameTxt, 1, 2);
        gridPane.add(query, 0, 4);
        gridPane.add(back, 1, 4);

        //点击查询按钮
        query.setOnAction(actionEvent -> {
            //只通过ID查询学生
            if (!studentIDTxt.getText().equals("") && gradeTxt.getText().equals("") && nameTxt.getText().equals("")){
                //将ID符合的学生添加到students集合中
                studentDao.select_studentTableByID_forManager(students, studentIDTxt.getText());//students 集合里面的数据以及改变了

                Main.studentTable(borderPane, students);
                tipStage.close();

            } else if (studentIDTxt.getText().equals("") && !gradeTxt.getText().equals("") && CommonUtils.isStrToNum(gradeTxt.getText())  && nameTxt.getText().equals("")) {//只通过班级查询学生,grade必须可以转换为数字,不然从数据库中查找的时候会报错
                //将grade符合的学生添加到students集合中
                studentDao.select_studentTableByGrade_forManager(students, Integer.parseInt(gradeTxt.getText()) );

                Main.studentTable(borderPane, students);
                tipStage.close();

            }else if (!studentIDTxt.getText().equals("") && !gradeTxt.getText().equals("") && CommonUtils.isStrToNum(gradeTxt.getText()) && nameTxt.getText().equals("")){//同时通过ID和班级查询,grade必须可以转换为数字
                //将ID和grade同时符合的学生添加到students集合中
                studentDao.select_studentTableByIDAndGrade_forManager(students, studentIDTxt.getText(), Integer.parseInt(gradeTxt.getText()));

                Main.studentTable(borderPane, students);
                tipStage.close();

            } else if (studentIDTxt.getText().equals("") && gradeTxt.getText().equals("") && !nameTxt.getText().equals("")) {//只通过姓名模糊查询
                //只通过姓名模糊查询
                studentDao.select_studentTableByName_forManager(students, nameTxt.getText());

                Main.studentTable(borderPane, students);
                tipStage.close();

            } else { //没有输入数据
                ViewUtils.tips("请检查数据");
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 480, 400);
        tipStage.setScene(scene);
        tipStage.show();
    }





    /**
     * 管理员刷新学生表格(增加,删除,修改后调用)
     * @param borderPane : 边界布局
     * @param students : 学生集合
     */
    public static void refresh_studentTable_forManager(BorderPane borderPane, ArrayList<Student> students) {
        //填写学生数据
        studentDao.selectAll_studentTable_forManager(students);

        //展示学生表格
        Main.studentTable(borderPane, students);
    }









    /**
     * 管理员管理老师
     */
    public static void manageTeacher() {
        //教师集合
        ArrayList<Teacher> teachers = new ArrayList<>();

        Main.stage.setTitle("管理员管理老师");
        BorderPane borderPane = new BorderPane();

        Button add = new Button("增加");
        Button delete = new Button("删除");
        Button update = new Button("修改");
        Button query = new Button("查询");
        Button refresh = new Button("刷新");
        Button back = new Button("返回");

        //点击增加教师按钮
        add.setOnAction(actionEvent -> {
            addTeacher(borderPane, teachers);
        });

        //点击删除教师按钮
        delete.setOnAction(actionEvent -> {
            //删除学生和老师的界面相同
            //删除老师
            deletePerson(borderPane, null, teachers, false);
        });

        //点击修改教师按钮
        update.setOnAction(actionEvent -> {
            inputID(borderPane, null, teachers, false);
        });

        //点击查询教师按钮
        query.setOnAction(actionEvent -> {
            queryTeacher(borderPane);
        });

        //点击刷新
        refresh.setOnAction(actionEvent -> {
            refresh_teacherTable(borderPane, teachers);
        });

        //点击返回按钮
        back.setOnAction(actionEvent -> {
            managerSelect();
        });

        //单行面板
        HBox hBox = ViewUtils.getHBox("-fx-font-size: 18;", 40, Pos.CENTER, true, add, delete, update, query, refresh, back);
        //设置borderPane的背景颜色
        borderPane.setBackground(new Background(new BackgroundFill(Color.rgb(200, 200, 200),null,null)));//设置hBox的背景颜色
        //返回按钮的外边距
        hBox.setMargin(back, new Insets(20, 20, 20, 60));

        //将hBox 单行面板 添加到边界布局的顶部
        borderPane.setTop(hBox);

        //从数据库中把老师数据全部填写到teachers
        teacherDao.selectAll_teacherTable(teachers);


        //展示教师表格
        teacherTable(borderPane, teachers);
        Main.stage.setScene(new Scene(borderPane,738, 500));
    }




    /**
     * 教师表格
     * @param borderPane : 边界布局
     * @param teachers : 教师集合
     */
    public static void teacherTable(BorderPane borderPane, ArrayList<Teacher> teachers) {
        //教师的信息表格
        TableView<Teacher> tableView = new TableView<>();

        //TableColumn类 创建列。然后使用TableView 类的 getColumns()方法将创建的列添加到表中。
        TableColumn id = new TableColumn<>("工号");
        TableColumn pwd = new TableColumn<>("密码");
        TableColumn name = new TableColumn<>("姓名");
        TableColumn sex = new TableColumn<>("性别");
        TableColumn age = new TableColumn<>("年龄");
        TableColumn graduate_school = new TableColumn<>("毕业学校");
        TableColumn salary = new TableColumn<>("工资");
        TableColumn telephone = new TableColumn<>("电话号码");

        //表格列宽宽度设置
        id.setMinWidth(90);
        name.setMinWidth(70);
        sex.setMinWidth(60);
        pwd.setMinWidth(85);
        age.setMinWidth(70);
        graduate_school.setMinWidth(120);
        salary.setMinWidth(70);
        telephone.setMinWidth(100);

        //确定数据导入的列
        //引号里面的内容一定要和teacher对象的变量名称对应,Teacher还要有相关变量的set,get方法
        id.setCellValueFactory(new PropertyValueFactory<>("id"));
        pwd.setCellValueFactory(new PropertyValueFactory<>("pwd"));
        name.setCellValueFactory(new PropertyValueFactory<>("name"));
        sex.setCellValueFactory(new PropertyValueFactory<>("sex"));
        age.setCellValueFactory(new PropertyValueFactory<>("age"));
        graduate_school.setCellValueFactory(new PropertyValueFactory<>("graduate_school"));
        salary.setCellValueFactory(new PropertyValueFactory<>("salary"));
        telephone.setCellValueFactory(new PropertyValueFactory<>("telephone"));

        tableView.getColumns().addAll(id, pwd, name, sex, age, graduate_school, salary, telephone);

        //将教师数组集合添加到表格中
        tableView.getItems().addAll(teachers);

        //将表格添加到边界布局的正中心
        borderPane.setCenter(tableView);
    }




    /**
     * 管理员增加教师
     * @param borderPane :边界布局
     * @param teachers :教师集合
     */
    public static void addTeacher(BorderPane borderPane, ArrayList<Teacher> teachers) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("增加教师", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label teacherID = new Label("工号 :  ");
        TextField teacherIDTxt = new TextField();
        Label pwd = new Label("密码 :  " );
        TextField pwdTxt = new TextField();
        Label name = new Label("姓名 :  " );
        TextField nameTxt = new TextField();
        Label sex = new Label("性别 :  " );
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        Label age = new Label("年龄 :  " );
        TextField ageTxt = new TextField();
        Label graduate_school = new Label("毕业学校 :  " );
        TextField graduate_schoolTxt = new TextField();
        Label salary = new Label("工资 :  " );
        TextField salaryTxt = new TextField();
        Label telephone = new Label("电话 :  " );
        TextField telephoneTxt = new TextField();
        Button add = new Button("增加");
        Button back = new Button("返回");

        //单行面板
        HBox hBox = new HBox(man, woman);

        gridPane.add(teacherID, 0, 0);
        gridPane.add(teacherIDTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdTxt, 1, 1);
        gridPane.add(name, 0, 2);
        gridPane.add(nameTxt, 1, 2);
        gridPane.add(sex, 0, 3);
        gridPane.add(hBox, 1, 3);
        gridPane.add(age, 0, 4);
        gridPane.add(ageTxt, 1, 4);
        gridPane.add(graduate_school, 0, 5);
        gridPane.add(graduate_schoolTxt, 1, 5);
        gridPane.add(salary, 0, 6);
        gridPane.add(salaryTxt, 1, 6);
        gridPane.add(telephone, 0, 7);
        gridPane.add(telephoneTxt, 1, 7);
        gridPane.add(add, 0, 9);
        gridPane.add(back, 1, 9);

        //点击增加按钮
        add.setOnAction(actionEvent -> {
            //检查是否为空
            boolean isData = !teacherIDTxt.getText().equals("") && !pwdTxt.getText().equals("") && !nameTxt.getText().equals("") &&
                    (man.isSelected() || woman.isSelected()) && !graduate_schoolTxt.getText().equals("") && !salaryTxt.getText().equals("") &&
                    !telephoneTxt.getText().equals("");
            //部分数据是否可以转换为数字
            boolean isNum = CommonUtils.isStrToNum(ageTxt.getText()) && CommonUtils.isStrToNum(salaryTxt.getText());
            //数据是否在合适的范围内
            boolean isSuitable = !ageTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(ageTxt.getText()), 22, 100);
            boolean isSuitable2 = !teacherDao.judge_teacherIDIsExist(teacherIDTxt.getText());

            if (isData && isNum && isSuitable && isSuitable2){
                String sexDemo = man.isSelected() ? "男" : "女";


                //将教师的数据封装到Teacher对象中,传入函数
                Teacher teacher = new Teacher(teacherIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo, Integer.parseInt(ageTxt.getText()),
                        graduate_schoolTxt.getText(), Integer.parseInt(salaryTxt.getText()), telephoneTxt.getText());
                //增加
                teacherDao.insert_teacher(teacher);
                //刷新教师表格
                refresh_teacherTable(borderPane, teachers);
                ViewUtils.tips("增加成功");
                tipStage.close();

            } else if (!isSuitable2) {
                ViewUtils.tips("请检查该教师的ID");
            } else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 380, 580);
        tipStage.setScene(scene);
        tipStage.show();
    }






    /**
     * 输入正确的ID号码后,管理员可以修改老师了
     * @param borderPane :边界布局
     * @param teachers :教师集合
     * @param ID : 需要修改的教师的 ID号码,我们将根据原先的ID来找到该教师
     */
    public static void updateTeacher(BorderPane borderPane, ArrayList<Teacher> teachers, String ID) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("修改学生", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        //先通过ID查询教师,给 TextField赋值
        teacherDao.select_teacherTableByID(teachers, ID);
        Teacher teacher = teachers.get(0);

        Label teacherID = new Label("教师ID :  ");
        TextField teacherIDTxt = new TextField(teacher.getId());
        Label pwd = new Label("密码 :  ");
        TextField pwdTxt = new TextField(teacher.getPwd());
        Label name = new Label("姓名 :  " );
        TextField nameTxt = new TextField(teacher.getName());
        Label sex = new Label("性别 :  " );
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        if (teacher.getSex().equals("男")) {
            man.setSelected(true);
        } else if (teacher.getSex().equals("女")) {
            woman.setSelected(true);
        }
        Label age = new Label("年龄 :  " );
        TextField ageTxt = new TextField(String.valueOf(teacher.getAge()));
        Label graduate_school = new Label("毕业学校 :  " );
        TextField graduate_schoolTxt = new TextField(teacher.getGraduate_school());
        Label salary = new Label("工资 :  " );
        TextField salaryTxt = new TextField(String.valueOf(teacher.getSalary()));
        Label telephone = new Label("电话 :  " );
        TextField telephoneTxt = new TextField(String.valueOf(teacher.getTelephone()));
        Button update = new Button("修改");
        Button back = new Button("返回");

        //单行面板
        HBox hBox = new HBox(man, woman);

        gridPane.add(teacherID, 0, 0);
        gridPane.add(teacherIDTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdTxt, 1, 1);
        gridPane.add(name, 0, 2);
        gridPane.add(nameTxt, 1, 2);
        gridPane.add(sex, 0, 3);
        gridPane.add(hBox, 1, 3);
        gridPane.add(age, 0, 4);
        gridPane.add(ageTxt, 1, 4);
        gridPane.add(graduate_school, 0, 5);
        gridPane.add(graduate_schoolTxt, 1, 5);
        gridPane.add(salary, 0, 6);
        gridPane.add(salaryTxt, 1, 6);
        gridPane.add(telephone, 0, 7);
        gridPane.add(telephoneTxt, 1, 7);
        gridPane.add(update, 0, 9);
        gridPane.add(back, 1, 9);

        //点击修改按钮
        update.setOnAction(actionEvent -> {
            //检查数据是否为空
            boolean isData = !teacherIDTxt.getText().equals("") && !pwdTxt.getText().equals("")  && !nameTxt.getText().equals("") &&
                    (man.isSelected() || woman.isSelected()) && !graduate_schoolTxt.getText().equals("") &&
                    !salaryTxt.getText().equals("") && !telephoneTxt.getText().equals("");
            //部分数据是否可以转换为数字
            boolean isNum = CommonUtils.isStrToNum(ageTxt.getText()) && CommonUtils.isStrToNum(salaryTxt.getText());
            boolean isSuitable = !ageTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(ageTxt.getText()), 22, 100);
            //教师ID不能有重复的
            boolean isSuitable2 = !teacherDao.judge_teacherIDIsExist(teacherIDTxt.getText()) || teacherIDTxt.getText().equals(ID);

            if (isData && isNum && isSuitable && isSuitable2){
                String sexDemo = man.isSelected() ? "男" : "女";

                //将教师属性封装到Teacher对象中,传入参数
                Teacher teacher1 = new Teacher(teacherIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo, Integer.parseInt(ageTxt.getText()),
                        graduate_schoolTxt.getText(), Integer.parseInt(salaryTxt.getText()), telephoneTxt.getText());

                //修改教师信息
                teacherDao.update_teacher(ID, teacher1);
                ViewUtils.tips("修改成功");
                tipStage.close();
                //刷新教师表格
                refresh_teacherTable(borderPane, teachers);
            } else if (!isSuitable2) {
                ViewUtils.tips("请检查教师ID是否正确");
            } else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 440, 680);
        tipStage.setScene(scene);
        tipStage.show();
    }



    /**
     * 管理员查询教师
     * @param borderPane : 边界布局
     */
    public static void queryTeacher(BorderPane borderPane) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();

        ViewUtils.setTopTip("可以进行ID查询、姓名模糊查询", tipStage);
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label teacherID = new Label("工号 :  ");
        TextField teacherIDTxt = new TextField();
        Label name = new Label("姓名");
        TextField nameTxt = new TextField();
        Button query = new Button("查询");
        Button back = new Button("返回");

        gridPane.add(teacherID, 0, 0);
        gridPane.add(teacherIDTxt, 1, 0);
        gridPane.add(name, 0, 1);
        gridPane.add(nameTxt, 1, 1);
        gridPane.add(query, 0, 3);
        gridPane.add(back, 1, 3);

        //点击查询按钮
        query.setOnAction(actionEvent -> {
            ArrayList<Teacher> teachers = new ArrayList<>();

            //只查询ID
            if (!teacherIDTxt.getText().equals("") && nameTxt.getText().equals("")){
                //将ID符合的教师添加到teachers集合中
                teacherDao.select_teacherTableByID(teachers, teacherIDTxt.getText());

                teacherTable(borderPane,teachers);
                tipStage.close();

            } else if (teacherIDTxt.getText().equals("") && !nameTxt.getText().equals("")) {
                //只通过姓名模糊查询
                teacherDao.select_teacherTableByName(teachers, nameTxt.getText());

                teacherTable(borderPane,teachers);
                tipStage.close();

            } else { //没有输入数据
                ViewUtils.tips("请检查数据");
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 340, 400);
        tipStage.setScene(scene);
        tipStage.show();
    }



    /**
     * 刷新教师表格
     * @param borderPane : 边界布局
     * @param teachers : 教师集合
     */
    public static void refresh_teacherTable(BorderPane borderPane, ArrayList<Teacher> teachers) {
        //填写全部的教师数据
        teacherDao.selectAll_teacherTable(teachers);

        //展示教师表格
        teacherTable(borderPane, teachers);
    }






    /**
     * 成绩柱状图
     */
    public static void dataStatistical() {
        Main.stage.setTitle("成绩统计");
        Button back = new Button("返回");

        //点击返回
        back.setOnAction(actionEvent -> {
            managerSelect();
        });

        CategoryAxis xAxis = new CategoryAxis();
        xAxis.setLabel("成绩分布");
        NumberAxis yAxis = new NumberAxis();
        yAxis.setLabel("人数");
        BarChart barChart = new BarChart<>(xAxis, yAxis);

        XYChart.Series dataSeries1 = new XYChart.Series();
        dataSeries1.setName("年级1");

        XYChart.Series dataSeries2 = null;
        XYChart.Series dataSeries3 = null;
        XYChart.Series dataSeries4 = null;

        try {
            dataSeries1.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(1, 0, 200)));
            dataSeries1.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(1, 200, 350)));
            dataSeries1.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(1, 350, 500)));
            dataSeries1.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(1, 500, 601)));

            dataSeries2 = new XYChart.Series();
            dataSeries2.setName("年级2");
            dataSeries2.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(2, 0, 200)));
            dataSeries2.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(2, 200, 350)));
            dataSeries2.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(2, 350, 500)));
            dataSeries2.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(2, 500, 601)));


            dataSeries3 = new XYChart.Series();
            dataSeries3.setName("年级3");
            dataSeries3.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(3, 0, 200)));
            dataSeries3.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(3, 200, 350)));
            dataSeries3.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(3, 350, 500)));
            dataSeries3.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(3, 500, 601)));

            dataSeries4 = new XYChart.Series();
            dataSeries4.setName("年级4");
            dataSeries4.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(4, 0, 200)));
            dataSeries4.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(4, 200, 350)));
            dataSeries4.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(4, 350, 500)));
            dataSeries4.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(4, 500, 601)));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        barChart.getData().add(dataSeries1);
        barChart.getData().add(dataSeries2);
        barChart.getData().add(dataSeries3);
        barChart.getData().add(dataSeries4);

        //单列面板
        VBox vBox = new VBox(barChart, back);
        vBox.setAlignment(Pos.CENTER);
        vBox.setMargin(back, new Insets(20, 0, 0, 0));

        Scene scene = new Scene(vBox, 500, 540);
        Main.stage.setScene(scene);
    }


}

Teacher_operate

package com.student_manageSystem;

import com.student_manageSystem.dao.impl.StudentImpl;
import com.student_manageSystem.dao.impl.TeacherImpl;
import com.student_manageSystem.pojo.Student;
import com.student_manageSystem.utils.CommonUtils;
import com.student_manageSystem.utils.ViewUtils;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import java.util.ArrayList;


/**
 * 教师只能增删改查 自己的学生
 */
public class Teacher_operate {
    private static final StudentImpl studentDao = new StudentImpl();
    private static final TeacherImpl teacherDao = new TeacherImpl();




    /**
     * 教师增加学生
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID
     */
    public static void addStudent(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();

        ViewUtils.setTopTip("增加学生",tipStage);
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label studentID = new Label("学生学号");
        TextField studentIDTxt = new TextField();
        Label pwd = new Label("学生密码");
        TextField pwdTxt = new TextField();
        Label name = new Label("学生姓名");
        TextField nameTxt = new TextField();
        Label sex = new Label("性别");
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        Label grade = new Label("学生年级");
        TextField gradeTxt = new TextField();
        Label teacher_id = new Label("教师姓名");
        TextField teacher_idTxt = new TextField();
        Button add = new Button("增加");
        Button back = new Button("返回");
        //单行面板
        HBox hBox = new HBox(man, woman);

        gridPane.add(studentID, 0, 0);
        gridPane.add(studentIDTxt, 1, 0);
        gridPane.add(pwd, 0, 1);
        gridPane.add(pwdTxt, 1, 1);
        gridPane.add(name, 0, 2);
        gridPane.add(nameTxt, 1, 2);
        gridPane.add(sex, 0, 3);
        gridPane.add(hBox, 1, 3);
        gridPane.add(grade, 0, 4);
        gridPane.add(gradeTxt, 1, 4);
        gridPane.add(teacher_id, 0, 6);
        gridPane.add(teacher_idTxt, 1, 6);
        gridPane.add(add, 0, 8);
        gridPane.add(back, 1, 8);

        //点击增加学生
        add.setOnAction(actionEvent -> {
            //数据要符合规范
            boolean isEmpty = !studentIDTxt.getText().equals("") && !pwdTxt.getText().equals("")  && !nameTxt.getText().equals("")
                    && (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().equals("");
            boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
            boolean isSuitable = !gradeTxt.getText().equals("") &&  CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
            //要判断教师的姓名是否存在,而不是教师ID,教师姓名要存在;学生学号不能存在
            boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && !studentDao.judge_StudentIDIsExist(studentIDTxt.getText());

            Student student = new Student();
            student.setTeacher_id(teacher_idTxt.getText());
            student.setId(studentID.getText());
            studentDao.select_teacherByTeacher_id(student);
            boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);

            try {
                //学生ID不能重复;学生修改的教师必须存在
                if (isEmpty && isNum && isSuitable && isSuitable2 && isSuitable3) {
                    String sexDemo = man.isSelected() ? "男" : "女";

                    studentDao.insert_student(studentIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo,
                            Integer.parseInt(gradeTxt.getText()), teacher_idTxt.getText());

                    ViewUtils.tips("增加成功");
                    tipStage.close();
                    //刷新表格中的数据
                    refresh_studentTable_forTeacher(borderPane, students, id_t);

                }else if (!isSuitable2) {
                    ViewUtils.tips("请检查教师姓名或学生ID");
                }else {
                    ViewUtils.tips("请检查数据");
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 340, 400);
        tipStage.setScene(scene);
        tipStage.show();
    }






    /**
     * 删除学生,老师
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID
     */
    public static void deletePerson(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("删除人员", tipStage);
        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label ID = new Label("ID号码 :  ");
        TextField IDTxt = new TextField();
        Button delete = new Button("删除");
        Button back = new Button("返回");

        gridPane.add(ID, 0, 0);
        gridPane.add(IDTxt, 1, 0);
        gridPane.add(delete, 0, 2);
        gridPane.add(back, 1, 2);

        //点击删除按钮
        delete.setOnAction(actionEvent -> {

            Student student = new Student();
            student.setTeacher_id(id_t);
            student.setId(IDTxt.getText());
            studentDao.select_teacherByTeacher_id(student);
            boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);

            //删除学生,先判断是否存在该学生
            if (studentDao.judge_StudentIDIsExist(IDTxt.getText()) && isSuitable3) {
                studentDao.delete_student(IDTxt.getText());
                ViewUtils.tips("成功删除该学生");
                tipStage.close();
                //刷新表格中的数据
                refresh_studentTable_forTeacher(borderPane, students, id_t);
            }else {
                ViewUtils.tips("请检查数据");
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 360, 200);
        tipStage.setScene(scene);
        tipStage.show();
    }






    /**
     * 教师修改学生:必须先输入正确的ID号码后,才能修改
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID,用于判断某个老师是否可以操作某个学生(教师只能操作自己的学生)
     */
    public static void inputID(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("搜索ID号码", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label ID = new Label("ID号码 :  ");
        TextField IDTxt = new TextField();
        Button search = new Button("搜索");
        Button back = new Button("返回");

        gridPane.add(ID, 0, 0);
        gridPane.add(IDTxt, 1, 0);
        gridPane.add(search, 0, 2);
        gridPane.add(back, 1, 2);

        //点击搜索按钮
        search.setOnAction(actionEvent -> {
            Student student = new Student();
            student.setTeacher_id(id_t);
            student.setId(IDTxt.getText());
            studentDao.select_teacherByTeacher_id(student);
            boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);

            //修改学生,先查询该学生是否存在,而且要修改的学生属于该教师
            if (studentDao.judge_StudentIDIsExist(IDTxt.getText()) && isSuitable3) {
                updateStudent(borderPane, students, IDTxt.getText(), id_t);
                tipStage.close();
            }else {
                ViewUtils.tips("请检查数据");
            }

        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 360, 200);
        tipStage.setScene(scene);
        tipStage.show();
    }





    /**
     * 输入正确的ID号码后,教师修改学生(学生的密码无法修改)
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_sOld : 需要修改的学生的 原来的ID号码,我们要根据原来的ID来查找这个学生
     * @param id_t : 教师ID
     */
    public static void updateStudent(BorderPane borderPane, ArrayList<Student> students, String id_sOld, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("修改学生", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        //先查询这个学生
        studentDao.select_studentTableByID_forTeacher(students, id_sOld, id_t);
        Student student = students.get(0);


        Label studentID = new Label("学号 :  ");
        TextField studentIDTxt = new TextField(student.getId());
        Label name = new Label("姓名 :  " );
        TextField nameTxt = new TextField(student.getName());
        Label sex = new Label("性别 :  " );
        RadioButton man = new RadioButton("男");
        RadioButton woman = new RadioButton("女");
        if (student.getSex().equals("男")) {
            man.setSelected(true);
        } else if (student.getSex().equals("女")) {
            woman.setSelected(true);
        }
        Label grade = new Label("年级 :  ");
        TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
        Label chinese = new Label("语文 :  " );
        TextField chineseTxt = new TextField(String.valueOf(student.getChinese()));
        Label math = new Label("数学 :  " );
        TextField mathTxt = new TextField(String.valueOf(student.getMath()));
        Label english = new Label("英语 :  " );
        TextField englishTxt = new TextField(String.valueOf(student.getEnglish()));
        Label chemistry = new Label("化学 :  " );
        TextField chemistryTxt = new TextField(String.valueOf(student.getChemistry()));
        Label political = new Label("政治 :  " );
        TextField politicalTxt = new TextField(String.valueOf(student.getPolitical()));
        Label history = new Label("历史 :  " );
        TextField historyTxt = new TextField(String.valueOf(student.getHistory()));
        Label teacher_id = new Label("教师姓名 :  " );
        TextField teacher_idTxt = new TextField(student.getTeacher_id());
        Button update = new Button("修改");
        Button back = new Button("返回");

        //单行面板
        HBox hBox = new HBox(man, woman);

        gridPane.add(studentID, 0, 0);
        gridPane.add(studentIDTxt, 1, 0);
        gridPane.add(name, 0, 1);
        gridPane.add(nameTxt, 1, 1);
        gridPane.add(sex, 0, 2);
        gridPane.add(hBox, 1, 2);
        gridPane.add(grade, 0, 3);
        gridPane.add(gradeTxt, 1, 3);
        gridPane.add(chinese, 0, 4);
        gridPane.add(chineseTxt, 1, 4);
        gridPane.add(math, 0, 5);
        gridPane.add(mathTxt, 1, 5);
        gridPane.add(english, 0, 6);
        gridPane.add(englishTxt, 1, 6);
        gridPane.add(chemistry, 0, 7);
        gridPane.add(chemistryTxt, 1, 7);
        gridPane.add(political, 0, 8);
        gridPane.add(politicalTxt, 1, 8);
        gridPane.add(history, 0, 9);
        gridPane.add(historyTxt, 1, 9);
        gridPane.add(teacher_id, 0, 10);
        gridPane.add(teacher_idTxt, 1, 10);
        gridPane.add(update, 0, 12);
        gridPane.add(back, 1, 12);

        //点击修改按钮
        update.setOnAction(actionEvent -> {
            //是否为空
            boolean isData = !studentIDTxt.getText().equals("") && !nameTxt.getText().equals("") && (man.isSelected() || woman.isSelected());
            //其中的班级和分数是否可以转换为数字
            boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText()) && CommonUtils.isStrToNum(chineseTxt.getText()) && CommonUtils.isStrToNum(mathTxt.getText()) &&
                    CommonUtils.isStrToNum(englishTxt.getText()) && CommonUtils.isStrToNum(chemistryTxt.getText()) && CommonUtils.isStrToNum(politicalTxt.getText()) &&
                    CommonUtils.isStrToNum(historyTxt.getText());
            //数据是否合适
            boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4) &&
                    !chineseTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chineseTxt.getText()), 0, 100) &&
                    !mathTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(mathTxt.getText()), 0, 100) &&
                    !englishTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(englishTxt.getText()), 0, 100) &&
                    !chemistryTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chemistryTxt.getText()), 0, 100) &&
                    !politicalTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(politicalTxt.getText()), 0, 100) &&
                    !historyTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(historyTxt.getText()), 0, 100);
            //判断该教师是否存在;判断新修改的学生ID是否已经被占有了
            boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && (!studentDao.judge_StudentIDIsExist(studentIDTxt.getText()) || studentIDTxt.getText().equals(id_sOld));

            boolean isSuitable3 =  teacherDao.judgeTeacher_nameAndId(teacher_idTxt.getText(), id_t);

            //数据正常
            if (isData && isNum && isSuitable && isSuitable2 && isSuitable3){
                String sexDemo = man.isSelected() ? "男" : "女";
                int totalScore = Integer.parseInt(chineseTxt.getText()) + Integer.parseInt(mathTxt.getText()) + Integer.parseInt(englishTxt.getText()) +
                        Integer.parseInt(chemistryTxt.getText()) + Integer.parseInt(politicalTxt.getText()) + Integer.parseInt(historyTxt.getText());

                //教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
                //修改学生信息
                //把数据封装到Student对象中,传入到函数
                Student student1 = new Student(studentIDTxt.getText(),"", nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()),
                        Integer.parseInt(chineseTxt.getText()), Integer.parseInt(mathTxt.getText()), Integer.parseInt(englishTxt.getText()), Integer.parseInt(chemistryTxt.getText()),
                        Integer.parseInt(politicalTxt.getText()), Integer.parseInt(historyTxt.getText()), totalScore, studentDao.replaceName_withId(teacher_idTxt.getText()));

                studentDao.update_studentByTeacherAndManager(id_sOld, student1);

                ViewUtils.tips("修改成功");
                tipStage.close();
                //刷新表格中的数据
                refresh_studentTable_forTeacher(borderPane, students, id_t);
            }else  {
                ViewUtils.tips("请检查数据");
            }

        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        //设置性别只能选择一个
        ToggleGroup toggleGroup = new ToggleGroup();
        //将单选按钮添加到到ToggleGroup对象,ToggleGroup对象将管理它们,使得一次只能选择一个单选按钮。
        man.setToggleGroup(toggleGroup);
        woman.setToggleGroup(toggleGroup);

        Scene scene = new Scene(gridPane, 440, 680);
        tipStage.setScene(scene);
        tipStage.show();
    }





    /**
     * 教师查询学生
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID
     */
    public static void queryStudent_byTeacher(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //创建提示框窗口对象
        Stage tipStage = new Stage();
        ViewUtils.setTopTip("可以进行ID查询、姓名模糊查询", tipStage);

        GridPane gridPane = new GridPane();
        ViewUtils.setGridPane(gridPane);

        Label studentID = new Label("学号 :  ");
        TextField studentIDTxt = new TextField();
        Label name = new Label("姓名 :  ");
        TextField nameTxt = new TextField();
        Button query = new Button("查询");
        Button back = new Button("返回");

        gridPane.add(studentID, 0, 0);
        gridPane.add(studentIDTxt, 1, 0);
        gridPane.add(name, 0, 1);
        gridPane.add(nameTxt, 1, 1);
        gridPane.add(query, 0, 3);
        gridPane.add(back, 1, 3);

        //点击查询按钮
        query.setOnAction(actionEvent -> {
            //只通过ID查询学生
            if (!studentIDTxt.getText().equals("") && nameTxt.getText().equals("")){
                //将ID符合的学生添加到students集合中
                studentDao.select_studentTableByID_forTeacher(students, studentIDTxt.getText(), id_t);

                Main.studentTable(borderPane, students);
                tipStage.close();

            } else if (studentIDTxt.getText().equals("") && !nameTxt.getText().equals("")) {//只通过姓名模糊查询
                //只通过姓名模糊查询
                studentDao.select_studentTableByName_forTeacher(students, nameTxt.getText(), id_t);

                Main.studentTable(borderPane, students);
                tipStage.close();

            } else { //没有输入数据
                ViewUtils.tips("请检查数据,二选一");
            }
        });

        //点击返回按钮,关闭提示框
        back.setOnAction(actionEvent -> {
            tipStage.close();
        });

        Scene scene = new Scene(gridPane, 480, 400);
        tipStage.setScene(scene);
        tipStage.show();
    }





    /**
     * 教师刷新学生表格(增加,删除,修改后调用)
     * @param borderPane : 边界布局
     * @param students : 学生集合
     * @param id_t : 教师ID
     */
    public static void refresh_studentTable_forTeacher(BorderPane borderPane, ArrayList<Student> students, String id_t) {
        //填写学生数据
        studentDao.selectAll_studentTable_forTeacher(students, id_t);

        //展示学生表格
        Main.studentTable(borderPane, students);
    }


}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值