文章目录

  • 概述
  • Service接口
  • Service接口实现类
  • 单元测试
  • Github地址

概述

在完成了 Dao层的部分之后,顺其自然的我们来到了Service层,需要调用Dao层提供的操作数据库的方法。

主要步骤如下:

1. 如用户上传了缩略图,则将原有的缩略图删除(磁盘上删除),并更新tb_product表的img_addr字段,否则不做任何处理。

2. 如果用户上传了新的商品详情图片,则将原有的属于该productId下的全部的商品详情图删除(磁盘上删除),同时删除productId对应的tb_product_img中的全部数据。

3. 更新tb_product的信息


Service接口

新增两个接口如下:

/*** * * @Title: queryProductById* * @Description: 根据productId查询product* * @param productId* * @return: Product*/Product queryProductById(long productId);/*** * * @Title: modifyProduct* * @Description: TODO* * @param product*            产品信息* @param imageHolder*            产品缩略图的封装信息* @param prodImgDetailList*            产品详情图片的封装信息* @throws ProductOperationException* * @return: ProductExecution*/ProductExecution modifyProduct(Product product, ImageHolder imageHolder, List<ImageHolder> prodImgDetailList) throws ProductOperationException;

Service接口实现类

/*** 注意事务控制@Transactional*/@Override@Transactionalpublic ProductExecution modifyProduct(Product product, ImageHolder imageHolder, List<ImageHolder> prodImgDetailList) throws ProductOperationException {if (product != null && product.getShop() != null && product.getShop().getShopId() != null && product.getProductCategory().getProductCategoryId() != null) {// 设置默认的属性product.setLastEditTime(new Date());// Step1. 处理缩略图if (imageHolder != null) {Product tempProduct = productDao.selectProductById(product.getProductId());// 1.1 删除旧的缩略图if (tempProduct.getImgAddr() != null) {ImageUtil.deleteStorePath(tempProduct.getImgAddr());}// 1.2 添加新的缩略图addProductImg(product, imageHolder);}// Step2. 处理商品详情// 如果添加商品成功,继续处理商品详情图片,并写入tb_product_imgif (prodImgDetailList != null && prodImgDetailList.size() > 0) {// 2.1 删除库表中productId对应的tb_product_img的信息deleteProductImgs(product.getProductId());// 2.2 处理商品详情图片,并写入tb_product_imgaddProductDetailImgs(product, prodImgDetailList);}try {// Step3.更新tb_productint effectNum = productDao.updateProduct(product);if (effectNum <= 0) {throw new ProductOperationException("商品更新失败");}return new ProductExecution(ProductStateEnum.SUCCESS, product);} catch (Exception e) {throw new ProductOperationException("商品更新失败:" + e.getMessage());}} else {return new ProductExecution(ProductStateEnum.NULL_PARAMETER);}}private void deleteProductImgs(Long productId) {// 获取该商铺下对应的productImg信息List<ProductImg> productImgList = productImgDao.selectProductImgList(productId);// 遍历删除该目录下的全部文件for (ProductImg productImg : productImgList) {ImageUtil.deleteStorePath(productImg.getImgAddr());}// 删除tb_product_img中该productId对应的记录productImgDao.deleteProductImgById(productId);}@Overridepublic Product queryProductById(long productId) {return productDao.selectProductById(productId);}

单元测试

@Testpublic void testModifyProduct() throws Exception {// 注意表中的外键关系,确保这些数据在对应的表中的存在ProductCategory productCategory = new ProductCategory();productCategory.setProductCategoryId(36L);// 注意表中的外键关系,确保这些数据在对应的表中的存在Shop shop = new Shop();shop.setShopId(5L);// 构造ProductProduct product = new Product();product.setProductName("offical_product");product.setProductDesc("product offical desc");product.setNormalPrice("100");product.setPromotionPrice("80");product.setPriority(66);product.setLastEditTime(new Date());product.setProductCategory(productCategory);product.setShop(shop);product.setProductId(7L);// 构造 商品图片File productFile = new File("D:/o2o/1.jpg");InputStream ins = new FileInputStream(productFile);ImageHolder imageHolder = new ImageHolder(ins, productFile.getName());// 构造商品详情图片List<ImageHolder> prodImgDetailList = new ArrayList<ImageHolder>();File productDetailFile1 = new File("D:/o2o/artisan.jpg");InputStream ins1 = new FileInputStream(productDetailFile1);ImageHolder imageHolder1 = new ImageHolder(ins1, productDetailFile1.getName());File productDetailFile2 = new File("D:/o2o/TIM.jpg");InputStream ins2 = new FileInputStream(productDetailFile2);ImageHolder imageHolder2 = new ImageHolder(ins2, productDetailFile2.getName());prodImgDetailList.add(imageHolder1);prodImgDetailList.add(imageHolder2);// 调用服务ProductExecution pe = productService.modifyProduct(product, imageHolder, prodImgDetailList);Assert.assertEquals(ProductStateEnum.SUCCESS.getState(), pe.getState());}

SQL日志如下:

JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@6f63b475] will be managed by Spring
==>  Preparing: SELECT p.product_id, p.product_name, p.product_desc, p.img_addr, p.normal_price, p.promotion_price, p.priority, p.create_time, p.last_edit_time, p.enable_status, p.product_category_id, p.shop_id, pm.product_img_id, pm.img_addr, pm.img_desc, pm.priority, pm.create_time FROM tb_product p LEFT JOIN tb_product_img pm ON p.product_id =pm.product_id WHERE p.product_id = ? ORDER BY pm.priority DESC
==> Parameters: 7(Long)
<==    Columns: product_id, product_name, product_desc, img_addr, normal_price, promotion_price, priority, create_time, last_edit_time, enable_status, product_category_id, shop_id, product_img_id, img_addr, img_desc, priority, create_time
<==        Row: 7, 香飘飘, test添加商品, \upload\item\shopImage\5\2018062911342810920.png, 5, 3.5, 99, 2018-06-29 11:34:28.0, 2018-06-29 11:34:28.0, 1, 36, 5, 11, \upload\item\shopImage\5\20180629113433657450.jpg, null, null, 2018-06-29 11:34:37.0
<==        Row: 7, 香飘飘, test添加商品, \upload\item\shopImage\5\2018062911342810920.png, 5, 3.5, 99, 2018-06-29 11:34:28.0, 2018-06-29 11:34:28.0, 1, 36, 5, 13, \upload\item\shopImage\5\20180629113434424572.jpg, null, null, 2018-06-29 11:34:37.0
<==        Row: 7, 香飘飘, test添加商品, \upload\item\shopImage\5\2018062911342810920.png, 5, 3.5, 99, 2018-06-29 11:34:28.0, 2018-06-29 11:34:28.0, 1, 36, 5, 12, \upload\item\shopImage\5\20180629113433541021.jpg, null, null, 2018-06-29 11:34:37.0
<==      Total: 3
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280] from current transaction
==>  Preparing: SELECT product_img_id, img_addr, img_desc, priority, create_time, product_id FROM tb_product_img WHERE product_id=? ORDER BY product_img_id
==> Parameters: 7(Long)
<==    Columns: product_img_id, img_addr, img_desc, priority, create_time, product_id
<==        Row: 11, \upload\item\shopImage\5\20180629113433657450.jpg, null, null, 2018-06-29 11:34:37.0, 7
<==        Row: 12, \upload\item\shopImage\5\20180629113433541021.jpg, null, null, 2018-06-29 11:34:37.0, 7
<==        Row: 13, \upload\item\shopImage\5\20180629113434424572.jpg, null, null, 2018-06-29 11:34:37.0, 7
<==      Total: 3
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280] from current transaction
==>  Preparing: DELETE FROM tb_product_img WHERE product_id = ?
==> Parameters: 7(Long)
<==    Updates: 3
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280] from current transaction
==>  Preparing: INSERT INTO tb_product_img ( img_addr, img_desc, priority, create_time, product_id ) VALUES ( ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ? )
==> Parameters: \upload\item\shopImage\5\20180701003247930380.jpg(String), null, null, 2018-07-01 00:32:48.299(Timestamp), 7(Long), \upload\item\shopImage\5\20180701003247961681.jpg(String), null, null, 2018-07-01 00:32:48.299(Timestamp), 7(Long)
<==    Updates: 2
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280] from current transaction
==>  Preparing: UPDATE tb_product SET product_name = ?, product_desc = ?, img_addr = ?, normal_price = ?, promotion_price = ?, priority = ?, last_edit_time = ?, product_category_id = ? WHERE product_id = ? AND shop_id=?
==> Parameters: offical_product(String), product offical desc(String), \upload\item\shopImage\5\2018070100324625530.jpg(String), 100(String), 80(String), 66(Integer), 2018-07-01 00:32:45.683(Timestamp), 36(Long), 7(Long), 5(Long)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]

检查数据库记录和磁盘上的文件,正确,单元测试通过。


Github地址

代码地址: https://github.com/yangshangwei/o2o

实战SSM_O2O商铺_33【商品】商品编辑之Service层的实现相关推荐

  1. 实战SSM_O2O商铺_34【商品】商品编辑之Controller层的实现

    文章目录 概述 ProductController 单元测试 Github地址 概述 在完成了 实战SSM_O2O商铺_33[商品]商品编辑之Service层的实现之后,我们继续来实现Controll ...

  2. 实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现

    文章目录 概述 Dao层接口 ProductDao#selectProductById ProductDao#updateProduct ProductImgDao#deleteProductImgB ...

  3. 实战SSM_O2O商铺_31【商品】商品添加之View层的实现

    文章目录 概述 productoperation.html productoperation.js 联调 检查结果 库表数据: 磁盘上的图片 Github地址 概述 在完成了 实战SSM_O2O商铺_ ...

  4. 实战SSM_O2O商铺_38【商品类别】解除商品与商品类别的关联

    文章目录 概述 Dao层 ProductDao.java ProductDao.xml 单元测试 Service层完善 ProductCategoryServiceImpl#deleteProduct ...

  5. 实战SSM_O2O商铺_28【商品】商品添加之Dao层的实现

    文章目录 概述 重温实体类 Prouct ProductImg ProductDao接口 Mapper配置文件 ProductImgDao接口 Mapper配置文件 单元测试 #ProductDaoT ...

  6. 实战SSM_O2O商铺_27【商品类别】删除商品类别从Dao到View层的开发

    文章目录 概述 Dao层 ProductCategoryDao接口增加接口方法 ProductCategoryDao SQL映射文件 闭环的单元测试 Servie层 接口 接口实现 单元测试 Cont ...

  7. 实战SSM_O2O商铺_26【商品类别】批量新增商品类别从Dao到View层的开发

    文章目录 概述 Dao层 ProductCategoryDao接口 ProductCategoryDao SQL映射文件 单元测试 Service层 ProductCategoryExecution ...

  8. 实战SSM_O2O商铺_35【商品】商品编辑之View层的实现

    文章目录 概述 productoperation.js 验证 Github地址 概述 接下来,我们来实现下 View层部分的操作. productoperation.js /*** 因为商品的添加和编 ...

  9. 实战SSM_O2O商铺_36【商品】商品列表之Dao+Service+Controller层的实现

    文章目录 概述 Dao层 ProductDao.java ProductDao.xml 单元测试 Service层 ProductService.java ProductServiceImpl.jav ...

最新文章

  1. Hibernate 实体映射类的状态值自动转换
  2. SAP Shipping address页面点了continue后的网络请求
  3. 使用ASP.NET MVC对用户组的自定义授权
  4. 怎么在页面关闭时执行代码
  5. 小白进阶——Mike21(一)
  6. docker 批量关闭处于exited状态的container容器--shell工具
  7. 关于WiFi密码破解的一些心得
  8. 2021年特种设备安全管理(全国特种设备安全管理人员模拟考试题库一)安考星
  9. View和ViewGroup的概念
  10. [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
  11. 学习java怎么样?后期能挣钱吗?
  12. 旷视科技 face++ 嵌入式软件开发-面试---深度好文
  13. 计算机整体硬盘销毁,如何完全销毁硬盘上的数据?
  14. springboot分布式锁实现(Redisson)
  15. MATLAB 的函数
  16. 学习通作业/考试每天微信提醒:使用pushplus和华为云函数
  17. php从业者不同阶段必须掌握的职业技能
  18. 【Word/word2007】将标题第1章改成第一章
  19. VSCode 安装Flutter 教程
  20. 数学分析教程史济怀练习9.5

热门文章

  1. python异步写文件_结合异步http请求将数据写入文件
  2. 分计算iv值_S71200PLC模拟量编程方法与计算原理
  3. 推荐系统笔记(简单概念)
  4. MAS 714课程笔记12: 线性规划
  5. 机器学习笔记:FLOPs
  6. 天池赛题解析:零基础入门语义分割-地表建筑物识别-CV语义分割实战(附部分代码)
  7. Linux疑难杂症解决方案100篇(六)-SHELL编程条件判断和流程控制
  8. 朴素贝叶斯(NaiveBayes)算法总结
  9. Python入门100题 | 第033题
  10. 基于外卖评论的舆情风控