日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实战SSM_O2O商铺_33【商品】商品编辑之Service层的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 概述
  • 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层的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: heyzo北岛玲在线播放 | 久久久久一| 天天综合色| 日本91网站 | 福利综合网 | 中文字幕亚洲精品在线观看 | 亚欧在线 | 国产精品久久久久久一区二区 | 国产艳妇疯狂做爰视频 | 亚洲一区二区三区午夜 | 91成人免费看 | 就爱啪啪网 | 国产寡妇色xxⅹ交肉视频 | 男女偷爱性视频刺激 | 精品孕妇一区二区三区 | 中文字幕国产剧情 | 大陆女明星乱淫合集 | 一级片观看 | 国产三级在线观看完整版 | 91精品国产高清91久久久久久 | 女生裸体无遮挡 | 一级黄色片网址 | 欧洲美女粗暴牲交免费观看 | 亚洲国产精品二区 | 无码一区二区三区免费 | 日韩黄视频 | 精品久久一二三区 | 日韩精品视频免费 | 欧美色爽| 九九九国产视频 | 希岛婚前侵犯中文字幕在线 | 婷婷狠狠爱 | 奇米影视在线观看 | 亚洲欧美激情另类校园 | 91九色丨porny丨国产jk | 精品人妻一区二区三区四区不卡 | 波多野结衣国产 | 福利电影一区二区三区 | 国语对白一区二区 | 老汉av| 中文字幕第6页 | 性欧美丰满熟妇xxxx性仙踪林 | 午夜看黄神器 | 男操女视频在线观看 | 国产午夜福利一区 | 亚洲国产v | 亚洲AV成人无码一二三区在线 | 青青草自拍偷拍 | 99蜜桃臀久久久欧美精品网站 | 狠狠爱综合网 | 久久久无码一区二区三区 | 久久精品99国产精品日本 | 久久综合精品国产二区无码不卡 | 国产美女视频网站 | 成片免费观看视频 | 欧美日韩在线免费观看视频 | 91精品免费视频 | 久久成人国产精品入口 | 久久夜色精品亚洲 | 欧美日韩国产在线一区 | 午夜黄网 | 午夜爽视频 | 精品黑人一区二区三区在线观看 | 免费在线观看黄网站 | 嫩草影院菊竹影院 | www.日韩欧美 | 中文字幕88页| 免费观看一区二区三区 | 丝袜人妻一区二区三区 | 9999免费视频 | 色婷婷国产精品 | 国产精品视频一区二区三 | 黄色大片网站在线观看 | 爱情岛论坛亚洲品质自拍 | 国产精品一区网站 | 中文高清av | 91精品人妻一区二区三区四区 | 黄色网址大全免费 | 操欧美女 | 日韩视频在线免费播放 | 日韩av资源在线观看 | 亚洲最大视频网站 | 欧美一级片在线视频 | 自拍1区 | 伦理片波多野结衣 | 最新毛片基地 | 国产调教视频在线观看 | 亚洲图片视频小说 | 日韩欧美亚洲一区二区三区 | 美女丝袜合集 | 啪啪网站免费看 | 老司机成人免费视频 | 国产成人无码精品亚洲 | 亚洲av无码一区二区三区dv | 免费又黄又爽又色的视频 | 欧美作爱视频 | 国产精品人人人人 | 激情国产一区 | 三级欧美韩日大片在线看 |