-## 一、项目架构分析
今天我们来学习第一个意义类的小项目,对数据的增删改查,甚至都暂时不涉及数据库
在登录注册中,添加数据是哪一个过程呢?
其实我们注册,就是一个添加用户的过程,那么登录又是什么操作呢?登录其实就是查询,判断你的用户名密码
展示数据也是一个查询的过程,添加购物车,如果你的购物车是用数据库来存的话,那么也是一个添加操作,结算是一个修改操作
各种复杂的项目都可以分解为增删改查
分析项目要求,我们暂时连继承和多态都没有用到,
引用数据也叫对象数组
分析一下架构
那么由于我们不使用数据库,数据访问层在这里就暂时不要了
数据的存储我们这里使用数组
业务逻辑搞清楚了,就可以开始搭建项目了
怎么体现呢?先不建类,我们先建包
那么他们两层直接是怎么传数据的呢?
直接调用方法就行了,那么这里·我们又引入了另外一种知识,实体类
即Javabean实体
再建立一个包
我们还可以建一个测试
二、主界面
框架大致搭好
新建一个测试类,把主方法放进去,然后调用前面写的方法,让它运行起来
创建实体类
/*
String name :客户姓名
char gender :性别
int age :年龄
String phone:电话号码
String email :电子邮箱
*/
package com.atguigu.bean;
public class Customer {
//成员变量
private String name;
private char gender;
private int age;
private String phone;
private String email;
//无参构造
public Customer(){
super();
}
//有参构造
public Customer(String name,char gender,int age,String phone,String email){
this.name=name;
this.gender=gender;
this.age=age;
this.phone=phone;
this.email=email;
}
//get/set
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public char getGender(){
return gender;
}
public void setName(char gender){
this.gender=gender;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public String getPhone(){
return phone;
}
public void SetEmail(String email){
this.email=email;
}
//
public String getEmail(){
return email;
}
public void SetName(String email){
this.email=email;
}
}
三、添加功能
//(1)键盘输入客户信息
//(2)创建Customer对象
//(3)调用CustomerService的 addCustomer(Customer c)
架构如下
实际上前面已经有分析过
增加的部分具体全部代码如下:
test里面,我们的测试类,test主类里面去调用菜单
package com.atguigu.test;
import com.atguigu.view.CustomerView;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
CustomerView c=new CustomerView();
c.menu();
}
}
CustomerView里面,我们加载和展示菜单,让用户可以进行菜单的选择,以及我们自己做好对应的功能(当然,不直接写在这,我们去调Service业务逻辑层)
package com.atguigu.view;
import com.atguigu.bean.Customer;
import com.atguigu.utils.CMUtility;
import com.atguigu.service.CustomerService;
public class CustomerView {
private CustomerService cs=new CustomerService();//不应该是局部变量
public void menu() {
System.out.println("------客户信息管理软件-----------");
System.out.println("/t/t 1、添加客户");
System.out.println("/t/t 2、修改客户");
System.out.println("/t/t 3、删除客户");
System.out.println("/t/t 4、查看客户列表");
System.out.println("/t/t 5、退 出");
System.out.println("请选择1-5");
char select =CMUtility.readMenuSelection();
switch (select) {
case '1':
add();
break;
case '2':
update();
break;
case '3':
delete();
break;
case '4':
list();
break;
case '5':
System.out.println("确定要退出吗?Y/N");
char confirm=CMUtility.readConfirmSelection();
if(confirm=='Y'){
return;
}
}
}
private void add() {
//第一步:键盘输入客户信息
System.out.println("-------添加客户--------- ");
System.out.print("姓名: ");
String name=CMUtility.readString(20);//限制String类型且长度不超过20
System.out.print("性别: ");
char gender=CMUtility.readChar();//限定是char
System.out.print("年龄");
int age=CMUtility.readInt();//限定是数字
System.out.print("电话:");
String tel = CMUtility.readString(11);//限制String类型且长度不超过11,一般手机都是11位
System.out.print("邮箱:");
String email=CMUtility.readString(32);//限制String类型且长度不超过32
//(2)创建Customer对象
Customer c=new Customer(name,gender,age,tel,email);
//(3)调用CustomerService的add
CustomerService cs=new CustomerService();//不应该是局部变量
cs.addCustomer(c);
System.out.println("-------------添加完成");
menu();
}
public void delete(){
}
public void list(){
}
public void update(){
}
}
CMUtility类,直接复制就行,这个公共类,提供给我们用户输入的功能以及对应的数据验证,我们暂时不考虑它怎么具体实现,我们只要知道它怎么用就行了
,源码如下
package com.atguigu.utils;
import java.util.*;
//static修饰的方法,可以通过"类名.方法"进行调用,当然也可以创建对象,再用"对象.方法"调用
public class CMUtility {
private static Scanner scanner = new Scanner(System.in);
public static char readMenuSelection() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false);
c = str.charAt(0);
if (c != '1' && c != '2' &&
c != '3' && c != '4' && c != '5') {
System.out.print("输入有误");
} else break;
}
return c;
}
public static char readChar() {
String str = readKeyBoard(1, false);
return str.charAt(0);
}
public static char readChar(char defaultValue) {
String str = readKeyBoard(1, true);
return (str.length() == 0) ? defaultValue : str.charAt(0);
}
public static int readInt() {
int n;
for (; ; ) {
String str = readKeyBoard(2, false);
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("��������������������룺");
}
}
return n;
}
public static int readInt(int defaultValue) {
int n;
for (; ; ) {
String str = readKeyBoard(2, true);
if (str.equals("")) {
return defaultValue;
}
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("��������������������룺");
}
}
return n;
}
public static String readString(int limit) {
return readKeyBoard(limit, false);
}
public static String readString(int limit, String defaultValue) {
String str = readKeyBoard(limit, true);
return str.equals("")? defaultValue : str;
}
public static char readConfirmSelection() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false).toUpperCase();
c = str.charAt(0);
if (c == 'Y' || c == 'N') {
break;
} else {
System.out.print("输入有误");
}
}
return c;
}
private static String readKeyBoard(int limit, boolean blankReturn) {
String line = "";
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.length() == 0) {
if (blankReturn) return line;
else continue;
}
if (line.length() < 1 || line.length() > limit) {
System.out.print("长度为" + limit + ",已经超出限制,请重新输入");
continue;
}
break;
}
return line;
}
}
下面我们看重点对象 Customer实体类,这个非常重要,我们需要依赖这个实体类对象来进行各种数据传值,我们把它放在这个包下面 com.atguigu.bean
/*
String name :客户姓名
char gender :性别
int age :年龄
String phone:电话号码
String email :电子邮箱
*/
package com.atguigu.bean;
public class Customer {
//成员变量
private String name;
private char gender;
private int age;
private String phone;
private String email;
//无参构造
public Customer(){
//super();
}
//有参构造
public Customer(String name,char gender,int age,String phone,String email){
this.name=name;
this.gender=gender;
this.age=age;
this.phone=phone;
this.email=email;
}
//get/set
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public char getGender(){
return gender;
}
public void setName(char gender){
this.gender=gender;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public String getPhone(){
return phone;
}
public void SetEmail(String email){
this.email=email;
}
//
public String getEmail(){
return email;
}
public void SetName(String email){
this.email=email;
}
}
下面就是业务逻辑层了,目前写得很简单
package com.atguigu.service;
import com.atguigu.bean.Customer;
public class CustomerService {
private Customer[]all;//用来存储客户对象
private int total;//记录实际存储的客户的数量
public CustomerService(){
all=new Customer[2];
}
public CustomerService(int initSize){
all = new Customer[initSize];
}
public void addCustomer(Customer c){
//(1)判断数组是否已满
if(total>all.length){
System.out.println("数组已满");
return;
}
//(2)把c存储all数组中
all[total+1]=c;
}
}
然后再跳到视图层CustomerView
这样添加功能就完成了
四、、Debug调试
代码调试是java的基础中的基础,我们就此项目来进行代码Debug调试的学习
1、我们怎么去Debug呢?
当你遇到了不知道哪里错的时候就需要Debug了,那么怎么调试(Debug)呢,在左边空格地方双击一下
你打的那个点就叫断点,那么我们又引入了另外一个概念,什么叫做单步调试呢?
调试点击“小虫子”
点击之后1出现调试画面
五、项目结束、删改查
最终代码如下:
test类
package com.atguigu.test;
import com.atguigu.view.CustomerView;
public class Test {
public static void main(String[] args) {
CustomerView view = new CustomerView();
view.menu();
}
}
Customer 类
/*
String name :客户姓名
char gender :性别
int age :年龄
String phone:电话号码
String email :电子邮箱
*/
package com.atguigu.bean;
public class Customer {
//成员变量
private String name;
private char gender;
private int age;
private String phone;
private String email;
//无参构造
public Customer(){
//super();
}
//有参构造
public Customer(String name,char gender,int age,String phone,String email){
this.name=name;
this.gender=gender;
this.age=age;
this.phone=phone;
this.email=email;
}
//get/set
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public char getGender(){
return gender;
}
public void setName(char gender){
this.gender=gender;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public String getPhone(){
return phone;
}
public void SetEmail(String email){
this.email=email;
}
//
public String getEmail(){
return email;
}
public void SetName(String email){
this.email=email;
}
public String getInfo(){
return name+"\t"+gender+"\t"+age+"\t"+phone+"\t"+email;
}
}
CMUtility 公共方法类,用于接收用户输入
package com.atguigu.utils;
import java.util.*;
//static修饰的方法,可以通过"类名.方法"进行调用,当然也可以创建对象,再用"对象.方法"调用
public class CMUtility {
private static Scanner scanner = new Scanner(System.in);
public static char readMenuSelection() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false);
c = str.charAt(0);
if (c != '1' && c != '2' &&
c != '3' && c != '4' && c != '5') {
System.out.print("选择错误,请重新输入:");
} else break;
}
return c;
}
public static char readChar() {
String str = readKeyBoard(1, false);
return str.charAt(0);
}
public static char readChar(char defaultValue) {
String str = readKeyBoard(1, true);
return (str.length() == 0) ? defaultValue : str.charAt(0);
}
public static int readInt() {
int n;
for (; ; ) {
String str = readKeyBoard(2, false);
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static int readInt(int defaultValue) {
int n;
for (; ; ) {
String str = readKeyBoard(2, true);
if (str.equals("")) {
return defaultValue;
}
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static String readString(int limit) {
return readKeyBoard(limit, false);
}
public static String readString(int limit, String defaultValue) {
String str = readKeyBoard(limit, true);
return str.equals("")? defaultValue : str;
}
public static char readConfirmSelection() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false).toUpperCase();
c = str.charAt(0);
if (c == 'Y' || c == 'N') {
break;
} else {
System.out.print("选择错误,请重新输入:");
}
}
return c;
}
private static String readKeyBoard(int limit, boolean blankReturn) {
String line = "";
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.length() == 0) {
if (blankReturn) return line;
else continue;
}
if (line.length() < 1 || line.length() > limit) {
System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");
continue;
}
break;
}
return line;
}
}
CustomerService 类
package com.atguigu.service;
import java.util.Arrays;
import com.atguigu.bean.Customer;
public class CustomerService {
private Customer[]all;//用来存储客户对象
private int total;//记录实际存储的客户的数量
public CustomerService(){
all=new Customer[2];
}
public CustomerService(int initSize){
all = new Customer[initSize];
}
//添加一个客户对象到当前数组中
public void addCustomer(Customer c){
//(1)判断数组是否已满
if(total>=all.length){
System.out.println("数组已满");
return;
}
//(2)把c存储all数组中
all[total]=c;
total++;
//all[total++]=c;
}
//返回所有已经存储的客户对象
public Customer[]getAll(){
//方法一推荐使用:直接用复制数据的方式,一行代码搞定
//return Arrays.copyOf(all, total);//复制一个新数组,长度为total
//方法二:
Customer[] result=new Customer[total];
for(int i=0; i<total;i++){
result[i]=all[i];
}
return result;
}
//根据客户的编号进行删除客户对象操作
public void removeById(int id){
//(1)确定下标
int index =id-1;
//(2)检查下标合理性
if(index<0||index>total){
System.out.println(id+"对应的客户不存在");//以后这个可以抛异常解决
return;
}
//(3)把[index]后面的元素往前移动
System.arraycopy(all, index+1, all, index, total-index-1);
all[--total]=null;
}
//根据客户编号查询一个客户对象的方法
public Customer getById(int id){
//(1)确定下标
int index =id-1;
//(2)考虑下标的合理性
if(index<0||index>=total){
System.out.println(id+"对应的客户不存在");//以后这个可以抛异常解决\
return null;
}
//(3)返回[index]位置的客户对象
return all[index];
}
//根据客户编号,替换原原来的客户对象
public void replace(int id,Customer newCustomer){
//(1)先确定index下标
int index =id-1;
//(2)检查下标
if(index<0||index>=total){
System.out.println(id+"对应的客户不存在");//以后这个可以抛异常解决\
return;
}
//(3)替换
all[index]= newCustomer;
}
}
package com.atguigu.view;
import com.atguigu.bean.Customer;
import com.atguigu.utils.CMUtility;
import com.atguigu.service.CustomerService;
public class CustomerView {
private CustomerService cs=new CustomerService();//不应该是局部变量,而应该是成员变量
//cs=new CustomerService();//不应该是局部变量
public void menu() {
System.out.println("------客户信息管理软件-----------");
System.out.println("/t/t 1、添加客户");
System.out.println("/t/t 2、修改客户");
System.out.println("/t/t 3、删除客户");
System.out.println("/t/t 4、查看客户列表");
System.out.println("/t/t 5、退 出");
System.out.println("请选择1-5");
char select =CMUtility.readMenuSelection();
switch (select) {
case '1':
add();
break;
case '2':
update();
break;
case '3':
delete();
break;
case '4':
list();
break;
case '5':
System.out.println("确定要退出吗?Y/N");
char confirm=CMUtility.readConfirmSelection();
if(confirm=='Y'){
return;
}
}
}
public void list(){
//(1)调用CustomService类的getAll方法获取 已经存储的所有客户对象
Customer[]all=cs.getAll();
//遍历显示
System.out.println("--------客户列表--------------");
System.out.println("编号\t姓名 \t性别\t年龄\t电话\t邮箱");
for (int i = 0; i < all.length; i++) {
System.out.println((i+1)+"\t"+ all[i].getInfo());
}
System.out.println();
System.out.println("-------------客户列表完成-----------------------");
menu();
}
public void delete(){
System.out.println("-------------删除客户-----------------------");
System.out.println("请选择要删除的客户编号(-1)退出");
int id =CMUtility.readInt();//获取用户输入的客户编号
if(id==-1){//如果是-1就结束
return;
}
System.out.print("确认删除(Y/N):");
char confirm=CMUtility.readConfirmSelection();
if(confirm=='N'){//如果不删除就结束
//return;
menu();
}
//调用CustomService的 removeById(int id)进行删除操作
cs.removeById(id);
System.out.println("-------------删除完成-----------------------");
menu();
}
//修改
public void update(){
System.out.println("-------------修改客户-----------------------");
System.out.println("请选择要修改的客户编号(-1)退出");
int id =CMUtility.readInt();//获取用户输入的客户编号
if(id==-1){//如果是-1就结束
return;
}
//调用CustomService的 getById(int id)获取该客户对象的原来的信息
Customer oldcustomer= cs.getById(id);
//输入新的数据
System.out.print("姓名("+oldcustomer.getName()+")");
String name=CMUtility.readString(20, oldcustomer.getName());
System.out.print("性别("+oldcustomer.getGender()+")");
char gender=CMUtility.readChar(oldcustomer.getGender());
System.out.print("年龄("+oldcustomer.getAge()+")");
int age=CMUtility.readInt(oldcustomer.getAge());
System.out.print("电脑("+oldcustomer.getPhone()+")");
String phone=CMUtility.readString(11,oldcustomer.getPhone());
System.out.print("邮箱("+oldcustomer.getEmail()+")");
String email=CMUtility.readString(32,oldcustomer.getEmail());
//获取完输入的数据后
//创建 一个新的客户对象
Customer newCustomer = new Customer(name,gender,age,phone,email);
//替换数组中原来的数组对象
cs.replace(id, newCustomer);
System.out.print("-------------修改完成-----------------------");
menu();
}
private void add() {
//第一步:键盘输入客户信息
System.out.println("-------添加客户--------- ");
System.out.print("姓名: ");
String name=CMUtility.readString(20);//限制String类型且长度不超过20
System.out.print("性别: ");
char gender=CMUtility.readChar();//限定是char
System.out.print("年龄:");
int age=CMUtility.readInt();//限定是数字
System.out.print("电话:");
String tel = CMUtility.readString(11);//限制String类型且长度不超过11,一般手机都是11位
System.out.print("邮箱:");
String email=CMUtility.readString(32);//限制String类型且长度不超过32
//(2)创建Customer对象
Customer c=new Customer(name,gender,age,tel,email);
//(3)调用CustomerService的add
cs.addCustomer(c);
System.out.println("-------------添加完成---------------");
menu();
}
}
搭建好就能直接运行