Spring Boot点餐系统实战(3)–商品信息的Dao和Service层开发和测试

本文将介绍商品信息(product_info)的Dao层和Service层的开发,以及测试。  

本文新关键词

分页 Pageable 类的使用 枚举 Enum 的使用 ...其他的继承上一节  

一、基本准备

1、数据表结构   注意,我们的 id 是 varchar 类型 以下是测试时添加的一些数据   2、这是最终的文件结构  

二、实体类的创建

ProductInfo.java
  1. package com.liuyanzhao.sell.entity;
  2. import lombok.Data;
  3. import org.hibernate.annotations.DynamicUpdate;
  4. import javax.persistence.Entity;
  5. import javax.persistence.Id;
  6. import java.math.BigDecimal;
  7. import java.util.Date;
  8. /**
  9.  * 商品信息
  10.  * @Author: 言曌
  11.  * @Date: 2017/11/11
  12.  * @Time: 下午9:25
  13.  */
  14. @Entity
  15. @DynamicUpdate
  16. @Data
  17. public class ProductInfo {
  18.     //商品编号
  19.     @Id
  20.     private String productId;
  21.     //商品名字
  22.     private String productName;
  23.     //商品价格
  24.     private BigDecimal productPrice;
  25.     //商品库存量
  26.     private Integer productStock;
  27.     //商品描述
  28.     private String productDescription;
  29.     //商品小图
  30.     private String productIcon;
  31.     //商品状态,0正常,1下架
  32.     private Integer productStatus;
  33.     //商品分类编号
  34.     private Integer categoryType;
  35.     //创建时间
  36.     private Date createTime;
  37.     //更新时间
  38.     private Date updateTime;
  39.     public ProductInfo() {
  40.     }
  41. }
这里就不解释了,前面的章节已经说过啦。记住我们的 id 用 String 类型啦。  

三、Dao 层的创建

ProductInfoDao.java
  1. package com.liuyanzhao.sell.dao;
  2. import com.liuyanzhao.sell.entity.ProductInfo;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import java.util.List;
  5. /**
  6.  * @Author: 言曌
  7.  * @Date: 2017/11/11
  8.  * @Time: 下午9:33
  9.  */
  10. public interface ProductInfoDao extends JpaRepository<ProductInfo,String>{
  11.     //根据商品状态获取商品列表
  12.     List<ProductInfo> findByProductStatus(Integer productStatus);
  13. }
 

四、Dao 层的测试

ProductInfoDaoTest.java
  1. package com.liuyanzhao.sell.dao;
  2. import com.liuyanzhao.sell.entity.ProductInfo;
  3. import org.junit.Assert;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import org.springframework.test.context.junit4.SpringRunner;
  9. import java.math.BigDecimal;
  10. import java.util.List;
  11. /**
  12.  * @Author: 言曌
  13.  * @Date: 2017/11/11
  14.  * @Time: 下午9:36
  15.  */
  16. @RunWith(SpringRunner.class)
  17. @SpringBootTest
  18. public class ProductInfoDaoTest {
  19.     @Autowired
  20.     private ProductInfoDao dao;
  21.     @Test
  22.     public void saveTest() {
  23.         ProductInfo productInfo = new ProductInfo();
  24.         productInfo.setProductId("123456");
  25.         productInfo.setProductName("怡宝矿泉水");
  26.         productInfo.setProductPrice(new BigDecimal(2.50));
  27.         productInfo.setProductStock(100);
  28.         productInfo.setProductDescription("纯天然,有点甜");
  29.         productInfo.setProductIcon("http:xxx.com/xx.jpg");
  30.         productInfo.setProductStatus(0);
  31.         productInfo.setCategoryType(2);
  32.         ProductInfo result =  dao.save(productInfo);
  33.         Assert.assertNotNull(result);
  34.     }
  35.     @Test
  36.     public void findByProductStatusTest() {
  37.         List<ProductInfo> result = dao.findByProductStatus(0);
  38.         Assert.assertNotEquals(0,result.size());
  39.     }
  40. }
 

五、Service 层的创建

1、ProductService.java
  1. package com.liuyanzhao.sell.service;
  2. import com.liuyanzhao.sell.entity.ProductInfo;
  3. import org.springframework.data.domain.Page;
  4. import org.springframework.data.domain.Pageable;
  5. import java.util.List;
  6. /**
  7.  * 商品
  8.  * @Author: 言曌
  9.  * @Date: 2017/11/12
  10.  * @Time: 上午11:32
  11.  */
  12. public interface ProductService {
  13.     //查询一个商品
  14.     ProductInfo findOne(String productId);
  15.     //查询所有上架的商品
  16.     List<ProductInfo> findUpAll();
  17.     /**
  18.      * 查询所有记录(用于后台)
  19.      * @param pageable 分页
  20.      * @return
  21.      */
  22.     Page<ProductInfo> findAll(Pageable pageable);
  23.     //添加商品
  24.     ProductInfo save(ProductInfo productInfo);
  25.     //加库存
  26.     //减库存
  27. }
我们这里的加库存,减库存以后再写 2、ProductServiceImpl.java
  1. package com.liuyanzhao.sell.service.impl;
  2. import com.liuyanzhao.sell.dao.ProductInfoDao;
  3. import com.liuyanzhao.sell.entity.ProductInfo;
  4. import com.liuyanzhao.sell.enums.ProductStatusEnum;
  5. import com.liuyanzhao.sell.service.ProductService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.data.domain.Page;
  8. import org.springframework.data.domain.Pageable;
  9. import org.springframework.stereotype.Service;
  10. import java.util.List;
  11. /**
  12.  * @Author: 言曌
  13.  * @Date: 2017/11/12
  14.  * @Time: 上午11:39
  15.  */
  16. @Service
  17. public class ProductServiceImpl implements ProductService {
  18.     @Autowired
  19.     private ProductInfoDao dao;
  20.     @Override
  21.     public ProductInfo findOne(String productId) {
  22.         return dao.findOne(productId);
  23.     }
  24.     @Override
  25.     public List<ProductInfo> findUpAll() {
  26.         //return dao.findByProductStatus(0);
  27.         return dao.findByProductStatus(ProductStatusEnum.UP.getCode());
  28.     }
  29.     @Override
  30.     public Page<ProductInfo> findAll(Pageable pageable) {
  31.         return dao.findAll(pageable);
  32.     }
  33.     @Override
  34.     public ProductInfo save(ProductInfo productInfo) {
  35.         return dao.save(productInfo);
  36.     }
  37. }
  注意:第33行的,给商品的状态赋值为0,有时候我们可能会写错,0和1有时候就稀里糊涂搞混了,所有这里使用枚举来管理再好不过了。 这里直接看第六步 还有,第38行,因为是查询所有商品(后台),需要分页,所以 Page<ProductInfo> findAll(Pageable pageable) 是 Page 类型,而不用 List,参数也是 Pageable 的实例对象。 关于 Pageable 我们可以看下它的源码 根据方法命名就能大概推测其功能了。  

六、使用枚举

因为我们表示商品的状态,即 product_status 字段,为 0 表示在架状态,正常可买。为 1则表示已经下架了。如果我们在代码里统统写 0,1这样一方面不利于维护,一方面容易出错。 现在,我们新建一个枚举类型 ProductStatusEnum.java
  1. package com.liuyanzhao.sell.enums;
  2. import lombok.Getter;
  3. /**
  4.  * 商品状态枚举
  5.  * @Author: 言曌
  6.  * @Date: 2017/11/12
  7.  * @Time: 上午11:42
  8.  */
  9. @Getter
  10. public enum ProductStatusEnum {
  11.     UP(0,"在架状态"),
  12.     DOWN(1,"下架状态")
  13.     ;
  14.     private Integer code;
  15.     private String message;
  16.     ProductStatusEnum(Integer code,String message) {
  17.         this.code = code;
  18.         this.message = message;
  19.     }
  20. }
  这样,我们第五步的 return dao.findByProductStatus(0); 可以改成 return dao.findByProductStatus(ProductStatusEnum.UP.getCode());  

七、Service 层的测试

  1. package com.liuyanzhao.sell.dao;
  2. import com.liuyanzhao.sell.entity.ProductInfo;
  3. import org.junit.Assert;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import org.springframework.test.context.junit4.SpringRunner;
  9. import java.math.BigDecimal;
  10. import java.util.List;
  11. /**
  12.  * @Author: 言曌
  13.  * @Date: 2017/11/11
  14.  * @Time: 下午9:36
  15.  */
  16. @RunWith(SpringRunner.class)
  17. @SpringBootTest
  18. public class ProductInfoDaoTest {
  19.     @Autowired
  20.     private ProductInfoDao dao;
  21.     @Test
  22.     public void saveTest() {
  23.         ProductInfo productInfo = new ProductInfo();
  24.         productInfo.setProductId("123456");
  25.         productInfo.setProductName("怡宝矿泉水");
  26.         productInfo.setProductPrice(new BigDecimal(2.50));
  27.         productInfo.setProductStock(100);
  28.         productInfo.setProductDescription("纯天然,有点甜");
  29.         productInfo.setProductIcon("http:xxx.com/xx.jpg");
  30.         productInfo.setProductStatus(0);
  31.         productInfo.setCategoryType(2);
  32.         ProductInfo result =  dao.save(productInfo);
  33.         Assert.assertNotNull(result);
  34.     }
  35.     @Test
  36.     public void findByProductStatusTest() {
  37.         List<ProductInfo> result = dao.findByProductStatus(0);
  38.         Assert.assertNotEquals(0,result.size());
  39.     }
  40. }
    本节先介绍到此

发表评论

目前评论:1