从底层开始写(也可以从交互层写)
-----------------------------------------HashMap静态数据库-----------------------------------------
package cn.tjpu.javase07.exam.diffcult;
import java.util.HashMap;
/**
* 模拟数据库
* 建一个静态的HashMap用来存放商品数据
*/
public class ProductDataBase {
public static HashMap<String,Product> pMap=new HashMap<>();
}
---------------------------------------------------商品类---------------------------------------------
package cn.tjpu.javase07.exam.diffcult;
/**
商品信息类:定义商品的属性及方法
id, name,price,库存数量
p01,透明胶带,8.8,1000
*/
public class Product {
private String Id;
private String pNname;
private float price;
private int pNumber;
public Product(){}
public Product(String id, String pNname, float price, int pNumber) {
this.Id = id;
this.pNname = pNname;
this.price = price;
this.pNumber = pNumber;
}
// public void setProduct(String id, String pNname, float price, int pNumber){
// this.Id = id;
// this.pNname = pNname;
// this.price = price;
// this.pNumber = pNumber;
// }
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getpNname() {
return pNname;
}
public void setpNname(String pNname) {
this.pNname = pNname;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getpNumber() {
return pNumber;
}
public void setpNumber(int pNumber) {
this.pNumber = pNumber;
}
public String toString(){
return this.Id+","+this.pNname+","+this.price+","+this.pNumber;
}
}
---------------------------------------------------数据层接口--------------------------------------------
package cn.tjpu.javase07.exam.diffcult;
import java.util.ArrayList;
import java.util.Set;
/**
* 数据层(DAO)的接口:定义数据层要完成的功能
* 业务层和数据层的接口
*/
public interface ProductDao {
//用户可以通过输入商品数据来向数据库中添加商品,如: idname,price,库存数量 —— p01,透明胶带,8.8,1000
public void addProduct(Product p);
//用户可以查看数据库中所有的商品,无参,返回商品集合
public Set<Product> getProducts();
//用户可以通过输入一个id来查看一个商品
public Product getProductById(String pid);
//用户可以通过输入一个name来查看一个商品
public Product getProductByName(String pname);
//用户可以通过输入一个价格范围(比如: 100->200)来查看符合条件的商品
public ArrayList<Product> getProductByPriceRange(float minprice,float maxprice);
//用户可以通过输入一个id来从数据库中删除一个商品
public void removeProduct(String pid);
//修改商品,拿到一个具体的商品对象,修改商品属性
public void updateProduct(Product p);
}
-------------------------------------------------数据层接口实现类------------------------------------------
package cn.tjpu.javase07.exam.diffcult;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* 数据库dao层的实现类,必须实现接口中定义的方法
*/
public class ProductDaoImpl implements ProductDao {
// 添加一个商品到数据库
@Override
public void addProduct(Product p) {
// 静态Hashmap可直接用类调用,将传入的商品放入map中
ProductDataBase.pMap.put(p.getId(), p);
}
// 查看所有商品,先把数据库中的所有值取出来放到collection中,然后遍历,并放到一个新建的HashSet中
@Override
public Set<Product> getProducts() {
// 把hashmap中所有商品的值拿出来
Collection<Product> values = ProductDataBase.pMap.values();
// 新建一个hashset
HashSet<Product> pset = new HashSet<>();
// 遍历collection,即遍历商品对象,map中的值
for (Product p : values) {
// 把商品对象放入set中
pset.add(p);
}
return pset;
}
// 根据id查看产品,数据存在HashMap中,键值id,可以直接通过id查看vaule(商品)
@Override
public Product getProductById(String pid) {
Product product = ProductDataBase.pMap.get(pid);
return product;
}
// 根据name查看产品,首先取出map中的值放入collection,遍历,若其中的名字与给定名字相同则返回这个商品查看
@Override
public Product getProductByName(String pname) {
Collection<Product> values = ProductDataBase.pMap.values();
for (Product p : values) {
if (p.getpNname().equals(pname)) {
return p;
}
}
return null;
}
// 通过输入一个价格范围(比如: 100->200)来查看符合条件的商品,先取值,然后遍历,把符合条件的商品放入新建的list中
@Override
public ArrayList<Product> getProductByPriceRange(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;
}
// 根据id移除数据库的商品,hashmap可直接通过移除键值来移除值
@Override
public void removeProduct(String pid) {
ProductDataBase.pMap.remove(pid);
}
// 根据指定的商品更新商品属性,hashmap可直接覆盖值
@Override
public void updateProduct(Product p) {
ProductDataBase.pMap.put(p.getId(), p);
}
}
---------------------------------------------------业务层接口--------------------------------------------
package cn.tjpu.javase07.exam.diffcult;
import java.util.ArrayList;
/**
面向接口编程
定义业务逻辑层(service)接口
交互层和业务层的接口
*/
public interface ProductService {
/**用户可以通过输入商品信息来向数据库中添加商品
* 如: id,name,price,库存数量
* p01,透明胶带,8.8,1000
*/
public void addProduct(Product p);
//查看数据库中所有的商品
public ArrayList<Product> getProducts();
//通过输入一个id来查看一个商品
public Product getProductById(String pid);
//通过输入一个name来查看一个商品
public Product getProductByName(String pname);
//通过输入一个价格范围(比如: 100->200)来查看符合条件的商品,不止一个
public ArrayList<Product> getProductByPriceRange(float minprice,float maxprice);
//通过输入一个id来从数据库中删除一个商品
public void removeProduct(String pid);
//通过指定一个id来修改一个商品的名称
public void updateName(String Id,String Name);
//通过指定一个id来修改一个商品的价格
public void updatePrice(String Id,float price);
//通过指定一个id来修改一个商品的库存数量
public void updateNumber(String Id,int number);
}
------------------------------------------业务层接口实现类-----------------------------------------
package cn.tjpu.javase07.exam.diffcult;
import java.util.ArrayList;
import java.util.Set;
/**
* service层的实现类,接口层定义的方法都要实现
*/
public class ServiceImpl implements ProductService {
// new 一个Dao层实现类的对象,用来调用Dao层的方法
ProductDao product = new ProductDaoImpl();
@Override
// 输入商品信息向数据库中添加商品
public void addProduct(Product p) {
product.addProduct(p);
}
@Override
// 把数据库中的原本存放在Set中的商品放入一个list返回即可查看所有商品
public ArrayList<Product> getProducts() {
ArrayList<Product> plist = new ArrayList<>();
Set<Product> pts = product.getProducts();// 该方法返回的是一个集合
for (Product p : pts) {
// 把集合中的商品数据放入list
plist.add(p);
}
return plist;
}
// 通过输入一个id来查看数据库中的一个商品
@Override
public Product getProductById(String pid) {
return product.getProductById(pid);
}
// 通过输入一个name来查看数据库中的一个商品
@Override
public Product getProductByName(String pname) {
return product.getProductByName(pname);
}
// 通过给定的价格范围从数据库中取符合条件的商品并用list返回查看
public ArrayList<Product> getProductByPriceRange(float minprice,
float maxprice) {
return product.getProductByPriceRange(minprice, maxprice);
}
@Override
// 移除数据库中指定id商品
public void removeProduct(String pid) {
product.removeProduct(pid);
}
@Override
// 通过指定id修改商品的名字
public void updateName(String Id, String Name) {
// 调用通过id查看商品名的方法,拿到这个商品对象
Product pid = product.getProductById(Id);
pid.setpNname(Name);// 调用重新设置名字的方法
// 调用dao层的方法,将更新好的商品数据放入数据库hashmap中
product.updateProduct(pid);
}
@Override
// 通过指定id修改商品的价格
public void updatePrice(String Id, float price) {
Product pid = product.getProductById(Id);
pid.setPrice(price);
product.updateProduct(pid);
}
@Override
// 通过指定id修改商品的库存数量
public void updateNumber(String Id, int number) {
Product pid = product.getProductById(Id);
pid.setpNumber(number);
;
product.updateProduct(pid);
}
}
---------------------------------------------------测试代码---------------------------------------------
package cn.tjpu.javase07.exam.diffcult;
/**
* 业务逻辑层(service)的测试
*/
import java.util.ArrayList;
import org.junit.Test;
public class ServiceImplTest {
// 测试商品添加和查看的功能
@Test
public void testaddProduct() {
// 实例化业务层实现类,以调用其方法
ServiceImpl service = new ServiceImpl();
// 造一个商品数据
Product p = new Product("01", "watch", 345.9f, 2);
// 调添加功能将造的商品放入数据库
service.addProduct(p);
// 调用查看商品的方法,拿到数据库中的所有商品放入一个临时列表,打印
ArrayList<Product> plist = service.getProducts();
for (Product t : plist) {
System.out.println(t);
}
}
// 测试通过id查看商品
@Test
public void testgetProductById() {
ServiceImpl service = new ServiceImpl();
Product p = new Product("01", "watch", 345.9f, 2);
service.addProduct(p);
// 调用方法拿到商品
Product pt = service.getProductById("01");
System.out.println(pt);
}
// 测试通过name查看商品
@Test
public void getProductByNameTest() {
ServiceImpl service = new ServiceImpl();
Product p = new Product("01", "watch", 345.9f, 2);
service.addProduct(p);
Product pt = service.getProductByName("watch");
System.out.println(pt);
}
// 测指定价格范围拿到符合条件的商品,放入临时list打印
@Test
public void testgetProductByPriceRange() {
ServiceImpl service = new ServiceImpl();
// 造商品
Product p1 = new Product("01", "watch1", 145.9f, 2);
Product p2 = new Product("02", "watch2", 245.9f, 3);
Product p3 = new Product("03", "watch3", 345.9f, 4);
Product p4 = new Product("04", "watch4", 445.9f, 6);
// 放入数据库
service.addProduct(p1);
service.addProduct(p2);
service.addProduct(p3);
service.addProduct(p4);
ArrayList<Product> plist = service.getProductByPriceRange(200, 400);
System.out.println(plist);
}
// 测试从数据库移除指定商品
@Test
public void testremoveProduct() {
ServiceImpl service = new ServiceImpl();
Product p1 = new Product("01", "watch1", 145.9f, 2);
Product p2 = new Product("02", "watch2", 245.9f, 3);
Product p3 = new Product("03", "watch3", 345.9f, 4);
Product p4 = new Product("04", "watch4", 445.9f, 6);
service.addProduct(p1);
service.addProduct(p2);
service.addProduct(p3);
service.addProduct(p4);
// 移除
service.removeProduct("02");
// 查看
ArrayList<Product> ptd = service.getProducts();
System.out.println(ptd);
}
// 根据id更新名字测试
@Test
public void testupdateName() {
ServiceImpl service = new ServiceImpl();
Product p1 = new Product("01", "watch1", 145.9f, 2);
service.addProduct(p1);
service.updateName("01", "wat");
System.out.println(p1);
}
// 根据id更新价格测试
@Test
public void testupdatePrice() {
ServiceImpl service = new ServiceImpl();
Product p1 = new Product("01", "watch1", 145.9f, 2);
service.addProduct(p1);
service.updatePrice("01", 148.0f);
System.out.println(p1);
}
// 根据id更新库存测试
@Test
public void testupdateNumber() {
ServiceImpl service = new ServiceImpl();
Product p1 = new Product("01", "watch1", 145.9f, 2);
service.addProduct(p1);
service.updateNumber("01", 6);
System.out.println(p1);
}
}