註冊登入和商品管理的例子
區域性變數快捷鍵設定
自動售貨系統架構圖
使用者登入註冊系統開發流程-思路
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(