局部变量快捷键设置
自动售货系统架构图
用户登录注册系统开发流程-思路
public interface UserDao{
public User findUserByName(String name);
}
1/先定义service层的接口
思考: 看service层需要为上层提供什么样的功能(接什么参数,返回什么结果)
2/ 根据service层接口写实现类
在写service实现类的过程中,需要调dao层功能
3、根据service层的需求,定义dao层接口
4、根据dao层接口,写dao层实现类
(假设数据库是在UserDatabase类的静态HashMap中)
//静态数据的模拟
package cn.edu360.javase24.day07.interfacedemo2;
import java.util.HashMap;
import cn.edu360.javase24.day07.interfacedemo2.pojo.User;
public class UserDatabase {
public static HashMap<String,User> userMap = new HashMap<>();
/**
* 此类在被jvm加载时,静态代码块就会执行
*/
static {
User u1 = new User();
u1.set("aaa", "123");
User u2 = new User();
u2.set("bbb", "123");
userMap.put(u1.getUserName(), u1);
userMap.put(u2.getUserName(), u2);
}
}
交互层-界面层
package cn.edu360.javase24.day07.interfacedemo2;
import java.util.Scanner;
import cn.edu360.javase24.day07.interfacedemo2.service.UserSerivce;
import cn.edu360.javase24.day07.interfacedemo2.service.UserServiceImpl;
public class UserMenu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 定义一个业务组件变量,用它的接口类型来引用
UserSerivce userManage = new UserServiceImpl();
boolean flag = true;
while (flag) {
System.out.println("1.登录; 2.注册; quit.退出");
String nextLine = sc.nextLine();
switch (nextLine) {
case "1":
System.out.println("请输入账号:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String pwd = sc.nextLine();
// 调用业务逻辑组件的登陆方法
boolean login = userManage.login(username, pwd);
if (login) {
System.out.println("恭喜您,登陆成功");
} else {
System.out.println("抱歉,您的用户名或密码不正确");
}
break;
case "2":
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String pwd1 = sc.nextLine();
System.out.println("请再次确认密码:");
String pwd2 = sc.nextLine();
// 调用业务逻辑组件的注册方法
String res = userManage.regist(name, pwd1, pwd2);
switch (res) {
case "1":
System.out.println("亲爱的,你有可能两次密码输的不一致");
break;
case "2":
System.out.println("亲爱的,你选的账号太抢手了,换一个吧");
break;
case "3":
System.out.println("亲爱的,你今天开始算是我的人了");
break;
default:
break;
}
break;
case "quit":
System.out.println("bye......");
flag = false;
break;
}
}
}
}
pojo文件夹
package cn.edu360.javase24.day07.interfacedemo2.pojo;
public class User {
private String userName;
private String password;
public void set(String userName,String password) {
this.userName = userName;
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
dao层
package cn.edu360.javase24.day07.interfacedemo2.dao;
import cn.edu360.javase24.day07.interfacedemo2.pojo.User;
public interface UserDao {
public User findUserByName(String userName);
public boolean checkUserIfExsit(String userName);
public void addUser(User user);
}
//dao接口实现
package cn.edu360.javase24.day07.interfacedemo2.dao;
import cn.edu360.javase24.day07.interfacedemo2.UserDatabase;
import cn.edu360.javase24.day07.interfacedemo2.pojo.User;
public class UserDaoImpl implements UserDao{
/**
* 根据一个用户名到数据库中查找该用户
*/
@Override
public User findUserByName(String userName) {
User user = UserDatabase.userMap.get(userName);
return user;
}
/**
* 检查数据库中是否已存在该用户名
*/
@Override
public boolean checkUserIfExsit(String userName) {
boolean containsKey = UserDatabase.userMap.containsKey(userName);
return containsKey;
}
/**
* 将传入的user对象存入数据库
*/
@Override
public void addUser(User user) {
UserDatabase.userMap.put(user.getUserName(), user);
}
package cn.edu360.javase24.day07.interfacedemo2.dao;
import org.junit.Test;
import cn.edu360.javase24.day07.interfacedemo2.UserDatabase;
import cn.edu360.javase24.day07.interfacedemo2.pojo.User;
/**
* 有一个框架,叫做junit
* 它可以帮我们调用各种测试方法
* 那我们就可以不用写main方法来做测试了
* @author ThinkPad
*
*/
//DAO层测试
public class UserDaoImplJunitTest {
@Test // 要运行哪个测试方法,就在这个方法上添加@Test注解,然后在方法名上点右键,选run as-->Junit
public void testAdd() {
UserDaoImpl userDaoImpl = new UserDaoImpl();
User u2 = new User();
u2.set("lisi", "123");
userDaoImpl.addUser(u2);
boolean ex = userDaoImpl.checkUserIfExsit("lisi");
System.out.println(ex);
}
@Test
public void testFind() {
UserDaoImpl userDaoImpl = new UserDaoImpl();
User xx = userDaoImpl.findUserByName("ccc");
System.out.println(xx.getPassword());
}
}
server层
package cn.edu360.javase24.day07.interfacedemo2.service;
/**
* 业务层的接口
* 定义了两个方法: login 、 regist
* @author ThinkPad
*
*/
public interface UserSerivce {
public boolean login(String name,String pwd);
/**
* 如果是密码不一致,则返回"1"
* 如果是用户名已存在,则返回"2"
* 如果注册成功,则返回"3"
* @param name
* @param pwd1
* @param pwd2
* @return
*/
//server层接口实现
public String regist(String name,String pwd1,String pwd2);
package cn.edu360.javase24.day07.interfacedemo2.service;
import cn.edu360.javase24.day07.interfacedemo2.dao.UserDao;
import cn.edu360.javase24.day07.interfacedemo2.dao.UserDaoImpl;
import cn.edu360.javase24.day07.interfacedemo2.pojo.User;
public class UserServiceImpl implements UserSerivce{
UserDao userDao = new UserDaoImpl();
@Override
public boolean login(String name, String pwd) {
// 调DAO层的功能去查询该用户名是否存在 ——》 传一个用户名,它帮我返回一个用户对象
User user = userDao.findUserByName(name);
if(user==null) {
return false;
}
if(user.getPassword().equals(pwd)) {
return true;
}
return false;
}
@Override
public String regist(String name, String pwd1, String pwd2) {
// 检查两次密码是否一致,如果不一致,直接返回 1
if(!pwd1.equals(pwd2)) {
return "1";
}
// 调dao层的功能去检查该用户名是否已存在
boolean ifExist = userDao.checkUserIfExsit(name);
// 如果用户名已存在,则直接返回 2
if(ifExist) {
return "2";
}
// 将用户的信息存储到数据库中
User u = new User();
u.set(name, pwd1);
userDao.addUser(u);
return "3";
}
}
}
/****** 复杂题 *************************************************/
模拟实现以下商品管理业务系统,商品管理系统的整体功能有:
注:商品数据存储在一个数据库中(用静态HashMap来模拟)
-
1、用户可以通过输入商品信息来向库中添加商品,如:
/** idname,price,库存数量 ***/
p01,透明胶带,8.8,1000 -
2、用户可以查看数据库中所有的商品
-
3、用户可以通过输入一个id来查看一个商品
-
4、用户可以通过输入一个name来查看一个商品
-
5、用户可以通过输入一个价格范围(比如: 100->200)来查看符合条件的商品
-
6、用户可以通过输入一个id来从数据库中删除一个商品
/** 讲解时额外添加的需求
-
7、用户可以通过指定一个id来修改一个商品的名称
-
8、用户可以通过制定一个id来修改一个商品的价格
-
9、用户可以通过制定一个id来修改一个商品的库存数量
** /要求:
a、整个程序要分成:交互层、 业务逻辑(service)层、 数据访问(dao)层
b、交互层和service层之间要用“面向接口编程”的模式来写
c、业务逻辑层和dao层之间要用“面向接口编程”的模式来写
/** 注:交互层打印菜单的过程很麻烦,可以不写交互层,只要完成service层的接口及实现类, dao层的接口及实现类 即可 **/
//数据存放
public class ProductDatabase {
public static HashMap<String, Product> pMap = new HashMap<>();
}
//server业务层
package cn.edu360.javase24.exam02.difficult;
import java.util.ArrayList;
public interface ProductService {
// 添加商品
public void addProduct(Product p);
// 查询所有商品
public ArrayList<Product> getAllProducts();
// 根据id查商品
public Product getProductById(String pId);
// 根据name查商品
public Product getProductByName(String pName);
// 根据价格区间查商品
public ArrayList<Product> getProductsByPriceRange(float minPrice,float maxPrice);
// 删除商品
public void removeProductById(String pId);
// 修改商品名称
public void updateName(String pId,String newName);
// 修改商品价格
public void updatePrice(String pId,float newPrice);
// 修改商品库存数量
public void updateStockNum(String pId,int newStockNum);
}
//业务层实现
package cn.edu360.javase24.exam02.difficult;
import java.util.ArrayList;
import java.util.Set;
public class ProductServiceImpl implements ProductService{
ProductDao productDao = new ProductDaoImpl();
@Override
public void addProduct(Product p) {
productDao.addProduct(p);
}
@Override
public ArrayList<Product> getAllProducts() {
ArrayList<Product> pList = new ArrayList<>();
Set<Product> pSet = productDao.getAllProducts();
for(Product p: pSet) {
pList.add(p);
}
return pList;
}
@Override
public Product getProductById(String pId) {
return productDao.getProductById(pId);
}
@Override
public Product getProductByName(String pName) {
return productDao.getProductByName(pName);
}
@Override
public ArrayList<Product> getProductsByPriceRange(float minPrice, float maxPrice) {
return productDao.getProductsByPriceRange(minPrice, maxPrice);
}
@Override
public void removeProductById(String pId) {
productDao.removeProductById(pId);
}
@Override
public void updateName(String pId, String newName) {
Product productById = productDao.getProductById(pId);
productById.setpName(newName);
productDao.updateProduct(productById);
}
@Override
public void updatePrice(String pId, float newPrice) {
Product productById = productDao.getProductById(pId);
productById.setPrice(newPrice);
productDao.updateProduct(productById);
}
@Override
public void updateStockNum(String pId, int newStockNum) {
Product productById = productDao.getProductById(pId);
productById.setStockNum(newStockNum);
productDao.updateProduct(productById);
}
}
//业务层测试
package cn.edu360.javase24.exam02.difficult;
import java.util.ArrayList;
import org.junit.Test;
public class ProductServiceImplTest {
/**
* 测试添加商品功能
*/
@Test
public void testAdd() {
ProductServiceImpl service = new ProductServiceImpl();
Product p = new Product("p1", "手环", 199.9f, 10000);
// 测试添加商品的功能
service.addProduct(p);
}
/**
* 测试根据id去商品的功能
*/
@Test
public void testGetById() {
ProductServiceImpl service = new ProductServiceImpl();
Product p = new Product("p1", "手环", 199.9f, 10000);
// 测试添加商品的功能
service.addProduct(p);
// 测试根据id去商品的功能
Product productById = service.getProductById("p2");
System.out.println(productById);
}
/**
* 测根据name取商品
*/
@Test
public void testGetByName() {
ProductServiceImpl service = new ProductServiceImpl();
Product p = new Product("p1", "手环", 199.9f, 10000);
// 测试添加商品的功能
service.addProduct(p);
Product productByName = service.getProductByName("手2环");
System.out.println(productByName);
}
/**
* 测试价格范围查询商品
*/
@Test
public void testGetByPriceRange() {
ProductServiceImpl service = new ProductServiceImpl();
Product p1 = new Product("p1", "手1环", 199.9f, 10000);
Product p2 = new Product("p2", "手2环", 299.9f, 10000);
Product p3 = new Product("p3", "手3环", 399.9f, 10000);
Product p4 = new Product("p4", "手4环", 499.9f, 10000);
// 测试添加商品的功能
service.addProduct(p1);
service.addProduct(p2);
service.addProduct(p3);
service.addProduct(p4);
ArrayList<Product> pList = service.getProductsByPriceRange(200, 400);
System.out.println(pList);
}
/**
* 修改商品名称功能的测试
*/
@Test
public void testUpdateProductName() {
ProductServiceImpl service = new ProductServiceImpl();
Product p1 = new Product("p1", "手1环", 199.9f, 10000);
service.addProduct(p1);
service.updateName("p1", "魔戒");
Product productById = service.getProductById("p1");
System.out.println(productById);
}
/**
* 修改商品价格功能的测试
*/
@Test
public void testUpdateProductPrice() {
ProductServiceImpl service = new ProductServiceImpl();
Product p1 = new Product("p1", "手1环", 199.9f, 10000);
service.addProduct(p1);
service.updatePrice("p1", 222.2f);
Product productById = service.getProductById("p1");
System.out.println(productById);
}
/**
* 修改商品库存功能的测试
*/
@Test
public void testUpdateProductStock() {
ProductServiceImpl service = new ProductServiceImpl();
Product p1 = new Product("p1", "手1环", 199.9f, 10000);
service.addProduct(p1);
service.updateStockNum("p1", 9000);
Product productById = service.getProductById("p1");
System.out.println(productById);
}
}
//数据访问层接口
package cn.edu360.javase24.exam02.difficult;
import java.util.ArrayList;
import java.util.Set;
public interface ProductDao {
// 添加商品
public void addProduct(Product p);
// 查询所有商品
public Set<Product> getAllProducts();
// 根据id查商品
public Product getProductById(String pId);
// 根据name查商品
public Product getProductByName(String pName);
// 根据价格区间查商品
public ArrayList<Product> getProductsByPriceRange(float minPrice,float maxPrice);
// 删除商品
public void removeProductById(String pId);
// 修改商品
public void updateProduct(Product p);
}
//数据访问层接口实现
package cn.edu360.javase24.exam02.difficult;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class ProductDaoImpl implements ProductDao{
/**
* 添加一个商品到数据库
*/
@Override
public void addProduct(Product p) {
ProductDatabase.pMap.put(p.getpId(), p);
}
@Override
public Set<Product> getAllProducts() {
Collection<Product> values = ProductDatabase.pMap.values();
HashSet<Product> pSet = new HashSet<>();
for(Product p:values) {
pSet.add(p);
}
return pSet;
}
@Override
public Product getProductById(String pId) {
Product product = ProductDatabase.pMap.get(pId);
return product;
}
@Override
public Product getProductByName(String pName) {
Collection<Product> values = ProductDatabase.pMap.values();
for(Product p: values) {
if(p.getpName().equals(pName)) {
return p;
}
}
return null;
}
@Override
public ArrayList<Product> getProductsByPriceRange(float minPrice, float maxPrice) {
Collection<Product> values = ProductDatabase.pMap.values();
ArrayList<Product> pList = new ArrayList<>();
for(Product p: values) {
if(p.getPrice()>=minPrice && p.getPrice() <= maxPrice) {
pList.add(p);
}
}
return pList;
}
@Override
public void removeProductById(String pId) {
ProductDatabase.pMap.remove(pId);
}
@Override
public void updateProduct(Product p) {
ProductDatabase.pMap.put(p.getpId(), p);
}
}
//pojo文件
package cn.edu360.javase24.exam02.difficult;
public class Product {
// p01,透明胶带,8.8,1000
private String pId;
private String pName;
private float price;
private int stockNum;
public Product() {
}
public Product(String pId, String pName, float price, int stockNum) {
this.pId = pId;
this.pName = pName;
this.price = price;
this.stockNum = stockNum;
}
public void set(String pId, String pName, float price, int stockNum) {
this.pId = pId;
this.pName = pName;
this.price = price;
this.stockNum = stockNum;
}
public String getpId() {
return pId;
}
public void setpId(String pId) {
this.pId = pId;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getStockNum() {
return stockNum;
}
public void setStockNum(int stockNum) {
this.stockNum = stockNum;
}
@Override
public String toString() {
return "[pId=" + pId + ", pName=" + pName + ", price=" + price + ", stockNum=" + stockNum + "]";
}
}