1. 程式人生 > 實用技巧 >初學java 學生管理系統——v0003版本 使用三層架構重寫

初學java 學生管理系統——v0003版本 使用三層架構重寫

把之前的學生管理系統,改造成三層架構的形式

三層架構即:

檢視層,通常用於與使用者互動,收集使用者輸入的資訊,展示資訊

業務層,通常做業務邏輯處理

持久層,通常只做與資料增刪改查相關的操作

對應的包結構就是

檢視層 controller

業務層 service

持久層 dao

外加 domain 存放模型類、entry 程式入口、utils 工具類

先來entry寫程式入口

順便把這個管理系統升級成攜帶老師管理的資訊管理系統

以學生管理系統為例,主要介紹,老師管理系統同學生管理系統一樣實現

因為controller是用於與使用者互動的

所以main方法呼叫StudentController物件的start方法,進入學生管理系統部分

public class InfoManagerEntry {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("--------歡迎來到資訊管理系統--------");
            System.out.println("請輸入您的選擇: 1.學生管理  2.老師管理  3.退出");
    
            String choice = sc.next();
            switch (choice) {
                case "1":
                    //System.out.println("學生管理");
                    StudentController studentController = new StudentController();
                    studentController.start();
                    break;
                case "2":
                    //System.out.println("老師管理");
                    new TeacherController().start();
                    break;
                case "3":
                    System.out.println("感謝您的使用");
                    System.exit(0); // 退出當前執行的JVM虛擬機器
                    break;
                default:
                    System.out.println("您的輸入有誤 請重新輸入");
                    break;
            }
        }
    }
}

在domain中建立Student類

包含幾個簡單欄位,並帶有get/set方法,以及無參和有參構造方法

public class Student {
    private String id;     // 學號
    private String name;    // 姓名
    private int age;        // 年齡
    private String birthday; // 生日
    
    public Student() {
    }
    
    public Student(String id, String name, int age, String birthday) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }
    
    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 int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public String getBirthday() {
        return birthday;
    }
    
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
}

在StudentController中 編寫方法start()實現學生管理系統的主介面輸出

public void start() {
    while (true) {
        System.out.println("--------歡迎來到 <學生> 管理系統--------");
        System.out.println("請輸入您的選擇: 1.新增學生  2.刪除學生  3.修改學生  4.檢視學生  5.退出");
        
        String choice = sc.next();
        switch (choice) {
            case "1":
                //System.out.println("新增學生");
                addStudent();
                break;
            case "2":
                //System.out.println("刪除學生");
                deleteStudent();
                break;
            case "3":
                //System.out.println("修改學生");
                updateStudent();
                break;
            case "4":
                //System.out.println("檢視學生");
                showStudent();
                break;
            case "5":
                System.out.println("感謝您的使用");
                return;
            default:
                System.out.println("您的輸入有誤");
                break;
        }
    }
}

分別編寫各個功能呼叫的具體方法

新增學生功能

private void addStudent() {
    // 接受使用者輸入資訊
    String id;
    while (true) {
        System.out.println("請輸入學號:");
        id = sc.next();
        int i = studentService.findStudentIndexById(id);
        if (i != -1) {
            System.out.println("學號已被佔用 請重新輸入");
        } else {
            break;
        }
    }
    Student stu = inputStudentInfo(id);
    // 傳遞給業務層
    boolean result = studentService.addStudent(stu);
    // 控制檯列印新增成功/新增失敗
    if (result) {
        System.out.println("新增成功");
    } else {
        System.out.println("新增失敗");
    }
}

此處與之前版本的管理系統不同的是檢視層把具體的操作資料的任務交給業務層,讓業務層去找持久層完成資料的新增功能

檢視層只負責把使用者的輸入提交給業務層,並把業務層的返回的結果輸出給使用者,完成與使用者的互動

業務層物件StudentService studentService = new StudentService(); 在StudentController的成員變數中宣告

學生資訊的新增功能

需要先呼叫業務層的findStudentIndexById方法查詢使用者輸入的學號是否已存在,該方法當存在使用者輸入的學號時,返回該條記錄的索引,不存在則返回-1,因此可以用其判斷學號是否被佔用

在業務層中實現findStudentIndexById方法,呼叫持久層的getIndex方法查詢索引並返回結果,目前的業務層負責的業務僅僅是傳遞資訊

public int findStudentIndexById(String id) {
    return studentDao.getIndex(id);
}

在持久層使用ArrayList型別的成員變數“list”儲存物件,因此getIndex方法如下

public int getIndex(String id) {
    int index = -1;
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i).getId().equals(id)) {
            index = i;
            break;
        }
    }
    return index;
}

資料逐層return到Controller,便可以返回值判斷是否繼續新增輸入資訊

當用戶輸入一個未被佔用的學號時,StudentController的addStudent方法繼續執行,為了方便,我把使用者輸入的資料封裝Student物件的部分提取成一個方法inputStudentInfo

private Student inputStudentInfo(String id) {
    System.out.println("請輸入姓名:");
    String name = sc.next();
    System.out.println("請輸入年齡:");
    String age = sc.next();
    System.out.println("請輸入生日:");
    String birthday = sc.next();
    return new Student(id, name, age, birthday);
}

之後StudentController的addStudent方法會呼叫StudentService的addStudent傳遞Student例項給業務層,讓業務層完成新增工作,並返回一個boolean型別結果表示是否新增成功

在業務層的addStudent方法中,呼叫持久層的addStudent方法,完成資料新增

public boolean addStudent(Student stu) {
    // 傳遞給持久層 返回結果給檢視層
    return studentDao.addStudent(stu);
}

持久層則直接呼叫ArrayList的add方法向“list”物件中新增Student物件

public boolean addStudent(Student stu) {
    return list.add(stu);
}

至此,新增學生的功能就實現完成了
(暫時更新到這裡)