【Java SE 代码回顾】——day07_交互层、业务层、DAO层的商品管理Demo

简介: 【Java SE 代码回顾】——day07_交互层、业务层、DAO层的商品管理Demo

从底层开始写(也可以从交互层写)

-----------------------------------------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);
  }
}
相关文章
|
4天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
18天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
32 5
Java反射机制:解锁代码的无限可能
|
14天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
47 3
|
20天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
57 10
|
15天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
14天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
22天前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
29 6
|
8天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
4天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
23 9
|
7天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####