从底层开始写(也可以从交互层写)
-----------------------------------------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); } }