【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);
  }
}
相关文章
|
11天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
35 3
|
25天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
57 10
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
55 24
|
19天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
55 2
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
79 5
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
55 5
|
2月前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
1月前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
9天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
11天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。