Java基础------第一个项目

黑马信息教育管理系统

一、项目分布

Controller:
		客服层:1.用于接收用户传递过来的数据信息
			  2.用于将接收到的数据传递给业务员进行数据逻辑操作
			  3.将业务员处理的逻辑结果展示给用户
Service:
		业务员层:1.用于接收客服层传递过来的数据
				2.用于调用仓管层进行数据交互
				3.将仓管反馈回来的数据传递给客服层
Dao:
		仓管层:1.用于接收业务层传递过来的指令
			   2.对所管理的数据库进行增删改查等数据处理
			   3.将处理后的数据反馈给业务层
Domain:
		封装类:储存所做业务中所需要的类,并对其进行封装
Entry:
		引擎类:用于程序主方法的操作

二、项目逻辑图

在这里插入图片描述

三、项目部署

在这里插入图片描述

四、项目展示界面

1.一级菜单展示
在这里插入图片描述

2.二级菜单展示
在这里插入图片描述

3.添加菜单展示

3.1添加成功菜单展示
在这里插入图片描述

3.2添加失败菜单展示

在这里插入图片描述

4.删除菜单展示

4.1删除成功菜单展示!
在这里插入图片描述

4.2删除失败菜单展示在这里插入图片描述

5.修改菜单展示

在这里插入图片描述

6.查看菜单展示
在这里插入图片描述

五、代码展示

1.一级菜单代码展示:

 /*
        整个系统的程序启动入口     -- 启动引擎
     */
    public class StudentManagerEntry {
        private static Scanner sc = new Scanner(System.in);
        public static void main(String[] args) {
            while (true) {
                // 展示系统一级功能菜单
                System.out.println("-------------欢迎来到黑马信息管理系统-------------");
                System.out.println("1. 学生管理");
                System.out.println("2. 老师管理");
                System.out.println("3. 退出");
                //接收用户录入的选项
                String option = sc.next();
                //switch小括号中本质就是要一个值,值的类型支持: byte,short,int,char,jdk1.5开始支持枚举,jdk1.7开始支持String
                //根据用户录入的选项来进行功能的路由
                switch (option) {
                    case "1":
                        //创建一个学生客服对象, 并调用学生对象中的start方法进行启动二级菜单
                        StudentController con = new StudentController();
                        con.start();
                        break;
                    case "2":
                        System.out.println("进入老师管理系统...");
                        break;
                    case "3":
                        System.out.println("感谢您的使用,欢迎下次光临!");
                        System.exit(0);
                        break;
                    default:
                        System.out.println("录入有误,请检查后重试!");
                        break;
                }
            }
        }
    }

2.二级菜单代码展示:

 public void start() {
        while (true) {
            System.out.println("-------------欢迎来到黑马学生管理系统-------------");
            System.out.println("1. 添加学生");
            System.out.println("2. 删除学生");
            System.out.println("3. 修改学生");
            System.out.println("4. 查看学生");
            System.out.println("5. 退出");
            String option = sc.next();
            switch (option) {
                case "1":
                    addStudent(1);//添加学生
                    break;
                case "2":
                    deleteStudent();//删除学生
                    break;
                case "3":
                    updateStudent(2);//修改学生
                    break;
                case "4":
                    findAllStudent();//查看学生
                    break;
                case "5":
                    return;//返回上一级
            }
        }
   }

3.Student类封装

 public class Student {
        private String id;
        private String name;
        private String age;
        private String birthday;
        public Student(String id, String name, String age, String birthday) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.birthday = birthday;
        }
        public Student() {
        }
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }
        public String getBirthday() {
            return birthday;
        }
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    }

4.添加方法

—controller层

4.1 addStudent()方法

 //客服的添加功能
        private void addStudent(int flag) {
            //1. 拿到添加的学生信息      -- 键盘录入
            System.out.println("请输入学号:");
            String id = inputStudentId(false,flag);
           //2. 调用方法,封装学生对象, 指挥业务员进行添加业务
            Student stu = getStudentInfo(id);
            boolean res = service.addStudent(stu);
            //3. 根据业务员返回的结果来给出对应的用户提示
            System.out.println(res ? "添加成功!" : "添加失败!");
        }

4.2inputStudentId()方法

 /*
            封装一个方法: 专门完成键盘录入一个id,并校验该id是否可用, 最终会返回一个可用的id
            boolean exists:
                未来方法被调用时,如果exists被赋值为true: 表示调用者期望得到一个系统中存在的id
                未来方法被调用时,如果exists被赋值为false: 表示调用者期望得到一个系统中不存在的id
            int flag:
            	未来方法被调用时要区分是添加方法调用的还是修改方法调用的,两个方法输出的提示语句不一样
         */
        private String inputStudentId(boolean exists,int flag){
            String id;
            while (true) {
                id = sc.next();
                // 指挥service校验当前学号是否可用
                boolean flag = service.isExists(id);
                if (flag == exists) {
                    break;
                } else {
                  if(flag == 1){
                    System.out.println("当前学号不可用,请重新录入");//添加时如果输入的id存在会提示
                  }else{
                    System.out.println("当前学号不存在,请重新录入");//修改时如果输入的id不存在会提示
                  }
                }
            }
            return id;
        }

4.3getStudenInfo方法

 //封装一个方法: 用来键盘录入学生信息,封装学生对象并返回
        private Student getStudentInfo(String id){
            System.out.println("请输入姓名:");
            String name = sc.next();
            System.out.println("请输入生日【格式要求:xxxx-xx-xx】:");
            String birthday = sc.next();
            //2. 将录入的数据封装成一个学生对象,指挥业务员进行添加学生业务处理
            return new Student(id, name, age, birthday);
        }

—Service层代码

4.4isExists()方法

     //业务员中的校验学号是否存在功能
        public boolean isExists(String id) {
            return dao.isExists(id);
        }

4.5addStudent()方法

    //业务员中的添加功能
        public boolean addStudent(Student stu) {
            // 指挥库管添加学生
            return dao.addStudent(stu);
        }

—Dao层

4.6isExists()方法

//库管校验学号是否存在功能
    public boolean isExists(String id) {
        //调用根据学号查索引方法
        int index = getIndex(id);
        /*
            index != -1 : 只有当index的值不为-1时结果为true--- 存在
            index != -1 : 只有当index的值为-1时结果为false----不存在
         */
        return index != -1;
    }

4.7getIndex()方法

   /*
            封装一个方法: 专门用来根据学号找索引
            找到了: 返回正常的索引
            找不到: 返回 -1
         */
        private int getIndex(String id) {
            //1. 假设要查找的学号不存在
            int index = -1;
            for (int i = 0; i < stus.length; i++) {
                Student stu = stus[i];
             // 只有当前学生对象不为null并且当前学生的学号和要删除的学生学号一致时,认为: 要删除的学员存在
                if (stu != null && stu.getId().equals(id)) {
                    //修改标记: 将当前学生对象stu的索引记录下来
                    index = i;
                    break;
                }
            }
            return index;
        }

4.8addStudent()方法

   //库管添加功能
        public boolean addStudent(Student stu) {
            //1. 创建一个数据仓库       -- 使用数组实现
            //标记位: 假设都存满了
            int index = -1;
            //遍历数组容器
            for (int i = 0; i < stus.length; i++) {
                if (stus[i] == null) {
                    // 只要有一个位置为null,那么就说明假设不成立
                    // 此时记录下当前为null的这个位置的索引
                    index = i;
                    break;
                }
            }
            //根据index的值来决定本次添加能否成功
            if (index == -1) {
                return false;   //满了,存不了了
            } else {
                //有位置,先把当前要添加的学生存入该位置
                stus[index] = stu;      // 添加学生
                return true;
            }
        }

5.删除方法

—Controller层

5.1deleteStudent()方法

  //客服的删除功能
        private void deleteStudent() {
            //1. 拿到要删除的学生学号
            System.out.println("请输入要删除的学生学号:");
            String delId = sc.next();
            //2. 指挥业务员进行删除业务操作
            boolean res = service.deleteStudent(delId);
            //3. 根据res的值来给出对应的提示
            if (res) {
                System.out.println("删除成功!");
            } else {
                System.out.println("删除失败: 请检查学号是否存在!");
            }
        }

—Service层

5.2deleteStudent()方法

  //客服的删除功能
        private void deleteStudent() {
            //1. 拿到要删除的学生学号
            System.out.println("请输入要删除的学生学号:");
            String delId = sc.next();
            //2. 指挥业务员进行删除业务操作
            boolean res = service.deleteStudent(delId);
            //3. 根据res的值来给出对应的提示
            if (res) {
                System.out.println("删除成功!");
            } else {
                System.out.println("删除失败: 请检查学号是否存在!");
            }
        }

—Dao层

5.3deleteStudent()方法

 //库管删除功能
    public boolean deleteStudent(String delId) {
        //1. 根据要删除的学号,查找对应学生在数组中的索引位置
        //调用根据学号查索引方法
        int index = getIndex(delId);//方法调用
        // 根据index的值来进行确认删除
        if (index == -1) {
            //说明当前学号不存在,则无法删除
            return false;
        } else {
            //2. 将该索引位置置为null
            stus[index] = null;
            return true;
        }
    }

6.查找方法

—Controller层

6.1findStudent()方法

//客服的查看功能
    private void findAllStudent() {
        //1. 指挥业务员进行查看业务
        Student[] allStudents = service.findAllStudent();
        /*
            可能存在的两种情况:
                1. 有数据:  Student[] allStudents = {stu,stu,null,null,null}
                2. 没有数据: Student[] allStudents = {null,null,null,null,null}     --> 期望业务				员处理成: Student[] allStudents = null
         */
        //2. 展示业务员返回的数据
        if (allStudents == null) {
            System.out.println("系统暂无数据,请添加后重试!");
        } else {
            //有数据就展示数据
            System.out.println("学号\t\t姓名\t年龄\t生日");
            for (int i = 0; i < allStudents.length; i++) {
                Student stu = allStudents[i];
                if (stu != null) {
                    System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() 									+ "\t\t" + stu.getBirthday());
                }
            }
        }

—Service层

6.2findAllStudent()方法

  //业务员中的查看功能
        public Student[] findAllStudent() {
            // 指挥库管拿到所有学生信息
            Student[] allStudents = dao.findAllStudents();
            /*
                可能存在的两种情况:
                    1. 有数据:  Student[] allStudents = {stu,stu,null,null,null}
                    2. 没有数据: Student[] allStudents = {null,null,null,null,null}     --> 期望业务员处理成: Student[] allStudents = null
             */
            // 假设系统中没有数据        -- boolean flag = false;
            boolean flag = false;
            for (int i = 0; i < allStudents.length; i++) {
                if (allStudents[i] != null) {
                    //只要有一个索引位置不为null,说明系统中有数据,这时候要修改标记
                    flag = true;
                    break;
                }
            }
            if (flag) {
                //有数据,返回正常数组
                return allStudents;
            } else {
                return null;
            }
        }

—Dao层

6.3findAllStudent()方法

 //库管查看功能
        public Student[] findAllStudents() {
            return stus;
        }

7.修改方法

—Controller层

7.1updateStudent()方法

//客服的修改功能
    private void updateStudent() {
        //1. 指挥业务员进行查看业务
        Student[] allStudents = service.findAllStudent();
        //判断系统是否有数据
        if (allStudents == null) {
            System.out.println("系统暂无数据,请添加后重试!");
        } else {
            //1. 输入要修改的学生学号
            System.out.println("请输入要修改的学生学号:");
            String updateId = inputStudentId(true);
            //调用方法,封装学生对象
            Student newStu = getStudentInfo(updateId);
            service.updateStudent(updateId, newStu);
            //4. 给出提示信息
            System.out.println("修改成功!");
        }
    }

—Service层

7.2updateStudent()方法

  //业务员中的修改功能
        public void updateStudent(String updateId, Student newStu) {
            //指挥dao进行修改操作
            dao.updateStudent(updateId, newStu);
        }

—Dao层

7.3updateStudent()方法

 //库管修改功能
    public void updateStudent(String updateId, Student newStu) {
        //1. 根据学号找到对应的学生在容器中的索引位置
        //调用根据学号查索引方法
        int index = getIndex(updateId);
        //2. 将该索引位置置为新的学生对象,从而达到修改效果
        stus[index] = newStu;
    }

六、注意

在此项目中我们用的数据存储是数组,但是如果简单的定义会使得数组被无限的被重新定义,造成的结果就是我们的系统永远无法存满,所以我们引出了static这个关键字去定义数组,使得在整个系统中只会使用一次。
   // 局部变量: 跟着方法走,方法执行一次,局部变量就创建一次!
        // 成员变量: 跟着对象走, 每创建一个当前类的对象,成员变量就跟着初始化一次!
        private static Student[] stus = new Student[5];

版权声明:本文为qq_35778360原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。