校园信息管理系统 Day01-添加功能
1案例驱动
1.1学习方式
- 根据项目来驱动学习,找出项目存在的问题,通过新的知识点进行解决问题
- 代码配合文字说明,一步一步慢慢走
1.2项目名称
校园信息管理系统
1.3思想介绍
分类思想
1.3.1概述
- 分工协作,专人做专事
1.3.2目的
- 解决重复代码过多的冗余,提高代码的复用性
- 解决业务逻辑聚集紧密导致的可读性差,提高代码的可读性
- 解决代码可维护性差,提高代码的维护性
1.3.3方法
- 创建多个类来存储不同的对象,来模拟现实的系统运作
- Student类 标准学生类,封装键盘录入的学生信息(id , name , age , birthday)
- StudentDao类 Dao : (Data Access Object 缩写) 用于访问存储数据的数组或集合
- StudentService类 用来进行业务逻辑的处理(例如: 判断录入的id是否存在)
- StudentController类 和用户打交道(接收用户需求,采集用户信息,打印数据到控制台)
2系统介绍
2.1需求介绍
- 添加学生: 键盘录入学生信息(id,name,age,birthday)
使用数组存储学生信息,要求学生的id不能重复 - 删除学生: 键盘录入要删除学生的id值,将该学生从数组中移除,如果录入的id在数组中不存在,需要重新录入
- 修改学生: 键盘录入要修改学生的id值和修改后的学生信息将数组中该学生的信息修改,如果录入的id在数组中不存在,需要重新录入
- 查询学生: 将数组中存储的所有学生的信息输出到控制台
2.2项目实现过程
-
各个类的现实映射
-
StudentController:客服接待,用于与用户的直接接触,接受各种数据,反馈接受结果
-
StudentService:业务员,与数据库的桥梁,进行业务逻辑的判断,
-
StudnetDeo:库管,进行数据的管理
-
Student:学生类
-
-
数据库的技术选型:数组—复习数组的知识点,需要自己写方法
-
注意书写格式:包:小驼峰;类:大驼峰[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JbPkjL8c-1648052605171)(C:\Users\22854\AppData\Roaming\Typora\typora-user-images\image-20220323223712807.png)]
-
entry为程序主入口,创建完的包和类如下
2.2.1 菜单的搭建
- 主界面的菜单
- 学生界面的菜单
- 老师界面的菜(先空着)
- 菜单实现步骤:
- 在主输出语句完成主界面的编写,
- 获取用户的选择Scanner的键盘如入
- 根据用户的选择进行对应的操作——switch语句
- 菜单实现步骤:
- 代码实现
- 学生类:
package domain;
public class Student {
// 学号,姓名,年龄,生日 四个属性
private String sid;
private String name;
private String age;
private String birthday;
//使用快捷键 alt+ins 进行空参,有参,get,set方法的构造
public Student(String sid, String name, String age, String birthday) {
this.sid = sid;
this.name = name;
this.age = age;
this.birthday = birthday;
}
public Student() {
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
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;
}
}
- 主方法的实现
package entry;
import controller.StudentController;
import java.util.Scanner;
public class Entry {
//创造主方法
public static void main(String[] args) {
//键盘录入创建对象
Scanner sc = new Scanner(System.in);
//对其进行 while (true) 死循环,只有输入3 退出系统
while (true) {
System.out.println("--------欢迎来到校园信息管理系统--------");
System.out.println("请输入您的选择: 1.学生管理 2.老师管理 3.退出");
//键盘录入
String choice = sc.next();
// 对choic 进行swith判断
switch (choice) {
case "1":
//模拟学生管理功能
System.out.println("1.学生管理 ");
break;
case "2":
//模拟老师管理功能
System.out.println("2.老师管理 ");
break;
case "3":
//直接退出jvm虚拟机
System.exit(0);
default:
System.out.println("输入错误");
break;
}
}
}
}
- 随后我们去添加学生界面的设计,我们则需要在主方法的case1 后面进行操作
- 思想 ;公司做大做强了。我要招聘一个前台客服来进行与用户的直接交流,所以创造一个StundetController对象来处理
//创造一个业务员
StudentController studentController=new StudentController();
//业务员中的start方法,进入学生管理的主界面
//因为是不存在的方法,用alt+entry进行快速建造
studentController.start();
- 代码与主界面差不多 ,只是跳出循环的时候不能直接跳出虚拟机,需要命名循环跳出循环,此处是studentLoop
package controller;
import java.util.Scanner;
public class StudentController {
public void start() {
//键盘录入创建对象
Scanner sc = new Scanner(System.in);
studentLoop:
while (true) {
System.out.println("--------欢迎来到 <学生> 管理系统--------");
System.out.println("请输入您的选择: 1.添加学生 2.删除学生 3.修改学生 4.查看学生 5.退出");
String choic = sc.next();
switch (choic) {
case "1":
System.out.println("添加");
break;
case "2":
System.out.println("删除");
break;
case "3":
System.out.println("修改");
break;
case "4":
System.out.println("查询");
break;
case "5":
System.out.println("感谢使用,再见");
break studentLoop;
default:
System.out.println("您的输入有误, 请重新输入");
break;
}
}
}
}
- 页面已经设计完成
2.2.2各个功能实现步骤
2.2.2.1添加功能
-
步骤
- 1.用户输入信息
- 2.StudentController客服接受数据,并进行封装,之后信息传递给StudentService业务员,并进行业务逻辑判断(id是否存在,此处先不进行),若可以添加,则返回添加成功,若不能添加,则返回添加失败
- 3.StudentService业务员收到数据但无权对数据进行直接的添加,需要传给StudentDao尽心后续操作
- 4.StudentDao需要先创建数组,此处长度为5,随后将把从StudentDao中接收到的数据进行添加,是否添加成功返回Boolean给StudentService
- 5.StudentService接受到的boolean返回给StudentController,StudentController根据返回的boolean返回结果
-
代码实现:
-
1.在case1之后创建添加学生的方法:
addStudent();
-
2.进行键盘录入,信息的提示输入,数据的封装
private void addStudent() {
//键盘录入创建对象
Scanner sc = new Scanner(System.in);
//提示输入信息
System.out.println("请输入姓名学号");
String sid = sc.next();
System.out.println("请输入姓名");
String name = sc.next();
System.out.println("请输入年龄");
String age = sc.next();
System.out.println("请输入生日");
String birthday = sc.next();
//封装数据
//创造一个学生
Student student=new Student();
student.setSid(sid);
student.setName(name);
student.setAge(age);
student.setBirthday(birthday);
}
- 3.把数据给业务员,要知晓能否储存,(雇佣一个业务员)返回类型为boolean,如果返回为true则可以储存,返回为false,则储存失败
//创建一个业务员
StudentService studentService = new StudentService();
//把数据给业务员,我只要结果
Boolean result = studentService.addstudent(student);
//根据结果result的值进行判断
if (result) {
System.out.println("输入成功");
}else {
System.out.println("输入失败");
}
- 4.补充业务员addstudent方法(alt+entry),因暂时没有逻辑判断,只起到一个桥梁的作用
public Boolean addstudent(Student student) {
//创建一个库管对象
StudentDao studentDao = new StudentDao();
//调用库管的添加方法,并接受
boolean result = studentDao.addstudent(student);
//把接收到的值返回给业务员
return result;
}
- 5.在添加之前,我们应该先创建存储对象——数组,因为数组存放的都是学生 ,所以数组类型为学生,数组进来了我们如何判断能不能存储呢?
- 现在我们要实现两个功能1:判断是否能存储2:如果能存储还要把数据存进去
- 思路:只要数组里还有空数据,则能存,所以需要遍历数组
-
要存数据,则需要知道哪一个位置是空的,所以需要一个索引值
-
还要返回是否存进去了,所以我们要根据这个索引值,来返回Boolean值
-
所以我们定义一个index为-1,假设都满了存不了
-
以下是代码实现
-
public class StudentDao {
Student[] stus = new Student[5];
public boolean addstudent(Student student) {
//定义索引值为-1,假设不存在
int index = -1;
//遍历数组
for (int i = 0; i < stus.length; i++) {
//如果找到了一个空位
if (stus[i] == null) {
//把i赋值给index;确定索引位
index = i;
//一找到就要跳出循环
break;
}
}
//不用写else 没有就 index的值就是-1
if ( index==-1) {
return false;
} else {
//进行存储
stus[index]=student;
return true;
}
}
}