实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现
生活随笔
收集整理的這篇文章主要介紹了
实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 概述
- Dao層接口
- ProductDao#selectProductById
- ProductDao#updateProduct
- ProductImgDao#deleteProductImgById
- ProductImgDao#selectProductImgList
- Mapper映射文件
- ProductDao.xml
- ProductImgDao.xml
- 單元測試
- ProductDaoTest
- ProductImgDaoTest
- Github地址
概述
完成了商品的添加Dao層到View層功能之后,
實戰SSM_O2O商鋪_28【商品】商品添加之Dao層的實現
實戰SSM_O2O商鋪_29【商品】商品添加之Service層的實現及重構
實戰SSM_O2O商鋪_30【商品】商品添加之Controller層的實現
實戰SSM_O2O商鋪_31【商品】商品添加之View層的實現
我們先來看下商品的編輯,最后做商品列表展示,當然了,可根據個人習慣,調整開發順序。
說到商品編輯,
- 首先肯定要根據productId查到對應Product相關的信息,既然這里是Dao層的開發,所以需要在Dao層需要開發一個 selectProductById 方法
- 商品信息有商品縮略圖和詳情圖片,這里我們先約定好:如果用戶傳入了新的商品縮略圖和詳情圖片,就將原有的商品縮略圖和詳情圖片刪除掉。
- 商品縮略圖的地址存放在tb_product的img_addr字段,所以只需要更新改表即可。 所以對應Dao層應該有個方法updateProduct
- 圖片縮略圖還涉及磁盤上的文件的刪除,需要根據productId獲取到Product ,然后獲取Product的imgAddr屬性,復用selectProductById 解渴
- 詳情圖片的地址存放在tb_product_img中,根據product_id可以查找到對應商品下的全部詳情圖片,所以對應Dao層應該有個方法deleteProductImgById
- 圖片詳情還涉及磁盤上的文件的刪除,需要根據productId獲取到List<ProductImg> ,然后遍歷該list,獲取集合中每個ProductImg的imgAddr地址,所以還需要有個selectProductImgList方法
Dao層接口
ProductDao#selectProductById
/*** * * @Title: selectProductById* * @Description: 根據productId查詢product* * @param productId* * @return: Product*/Product selectProductById(long productId);ProductDao#updateProduct
/*** * * @Title: updateProduct* * @Description: 修改商品* * @param product* * @return: int*/int updateProduct(Product product);ProductImgDao#deleteProductImgById
/*** * * @Title: deleteProductImgById* * @Description: 刪除商品對應的商品詳情圖片* * @param productId* * @return: int*/int deleteProductImgById(long productId);ProductImgDao#selectProductImgList
/*** * * @Title: selectProductImgList* * @Description: 根據productId查詢商鋪對應的圖片詳情信息* * @param productId* * @return: List<ProductImg>*/List<ProductImg> selectProductImgList(long productId);Mapper映射文件
ProductDao.xml
說明見注釋
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.artisan.o2o.dao.ProductDao"><resultMap id="productMap" type="com.artisan.o2o.entity.Product" ><id column="product_id" property="productId"/><!-- property對應實體類中的屬性名 column 對應庫表中的字段名 --><result column="product_name" property="productName"/><result column="product_desc" property="productDesc"/><result column="img_addr" property="imgAddr" /><result column="normal_price" property="normalPrice" /><result column="promotion_price" property="promotionPrice" /><result column="priority" property="priority" /><result column="create_time" property="createTime" /><result column="last_edit_time" property="lastEditTime" /><result column="enable_status" property="enableStatus" /><!-- 一對一使用association product中的屬性為productCategory, 通過數據庫中的product_category_id關聯起來的類型為 com.artisan.o2o.entity.ProductCategory--><association property="productCategory" column="product_category_id"javaType="com.artisan.o2o.entity.ProductCategory"><!-- 對應ProductCategory中的屬性 和 tb_product_category的字段 --><id column="product_category_id" property="productCategoryId" /><result column="product_category_name" property="productCategoryName" /></association><!-- 一對一使用association product中的屬性為shop, 通過數據庫中的shop_id關聯起來的類型為com.artisan.o2o.entity.Shop--><association property="shop" column="shop_id"javaType="com.artisan.o2o.entity.Shop"><id column="shop_id" property="shopId" /><!-- 對應Shop中的屬性 和 tb_shop的字段 ,如果是符合對象,使用xx.xxx的方式--><result column="owner_id" property="owner.userId" /><result column="shop_name" property="shopName" /></association><!-- 一對多使用collection product中的屬性為productImgList,并且是通過庫表中的product_id關聯起來的,保存的類型為com.imooc.myo2o.entity.ProductImg --><collection property="productImgList" column="product_id"ofType="com.artisan.o2o.entity.ProductImg"><id column="product_img_id" property="productImgId" /><result column="img_addr" property="imgAddr" /><result column="img_desc" property="imgDesc" /><result column="priority" property="priority" /><result column="create_time" property="createTime" /><result column="product_id" property="productId" /></collection></resultMap><insert id="insertProduct" parameterType="com.artisan.o2o.entity.Product" useGeneratedKeys="true" keyProperty="productId" keyColumn="product_id">INSERT INTOtb_product(product_name,product_desc,img_addr,normal_price,promotion_price,priority,create_time,last_edit_time,enable_status,product_category_id,shop_id)VALUES(#{productName},#{productDesc},#{imgAddr},#{normalPrice},#{promotionPrice},#{priority},#{createTime},#{lastEditTime},#{enableStatus},#{productCategory.productCategoryId},#{shop.shopId})</insert><select id="selectProductById" resultMap="productMap" parameterType="Long"><!-- 具體的sql -->SELECTp.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_timeFROMtb_product p<!-- 左連接LEFT JOIN,(即使該商品沒有商品詳情圖片,也要查詢出來該商鋪) -->LEFT JOINtb_product_img pmONp.product_id =pm.product_idWHEREp.product_id = #{productId}ORDER BYpm.priority DESC</select><update id="updateProduct" parameterType="com.artisan.o2o.entity.Product">UPDATEtb_product<set><!-- 注意后面的逗號 --><if test="productName !=null ">product_name = #{productName},</if><if test="productDesc !=null ">product_desc = #{productDesc},</if><if test="imgAddr !=null ">img_addr = #{imgAddr},</if><if test="normalPrice != null ">normal_price = #{normalPrice},</if><if test="promotionPrice != null ">promotion_price = #{promotionPrice},</if><if test="priority != null">priority = #{priority},</if><if test="createTime != null">create_time = #{createTime},</if><if test="lastEditTime != null">last_edit_time = #{lastEditTime},</if><if test="enableStatus != null ">enable_status = #{enableStatus},</if><!-- 注意如果是引用的復雜對象的寫法 --><if test="productCategory != null and productCategory.productCategoryId != null ">product_category_id = #{productCategory.productCategoryId},</if></set>WHEREproduct_id = #{productId}AND shop_id=#{shop.shopId}</update></mapper>ProductImgDao.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.artisan.o2o.dao.ProductImgDao"><insert id="batchInsertProductImg" parameterType="com.artisan.o2o.entity.ProductImg" useGeneratedKeys="true" keyProperty="productImgId" keyColumn="product_img_id">INSERT INTOtb_product_img(img_addr,img_desc,priority,create_time,product_id)VALUES<foreach collection="list" item="productImg" index="index" separator=",">(#{productImg.imgAddr},#{productImg.imgDesc},#{productImg.priority},#{productImg.createTime},#{productImg.productId})</foreach></insert><delete id="deleteProductImgById">DELETE FROM tb_product_img WHERE product_id = #{produtId}</delete><select id="selectProductImgList" resultType="com.artisan.o2o.entity.ProductImg">SELECT product_img_id,img_addr,img_desc,priority,create_time,product_idFROM tb_product_imgWHERE product_id=#{productId}ORDER BY product_img_id </select></mapper>單元測試
ProductDaoTest
package com.artisan.o2o.dao;import java.util.Date;import org.junit.Assert; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; import org.springframework.beans.factory.annotation.Autowired;import com.artisan.o2o.BaseTest; import com.artisan.o2o.entity.Product; import com.artisan.o2o.entity.ProductCategory; import com.artisan.o2o.entity.Shop;@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class ProductDaoTest extends BaseTest {@AutowiredProductDao productDao;@Testpublic void testA_InsertProdcut() {// 注意表中的外鍵關系,確保這些數據在對應的表中的存在ProductCategory productCategory = new ProductCategory();productCategory.setProductCategoryId(36L);// 注意表中的外鍵關系,確保這些數據在對應的表中的存在Shop shop = new Shop();shop.setShopId(5L);Product product = new Product();product.setProductName("test_product");product.setProductDesc("product desc");product.setImgAddr("/aaa/bbb");product.setNormalPrice("10");product.setPromotionPrice("8");product.setPriority(66);product.setCreateTime(new Date());product.setLastEditTime(new Date());product.setEnableStatus(1);product.setProductCategory(productCategory);product.setShop(shop);int effectNum = productDao.insertProduct(product);Assert.assertEquals(1, effectNum);}@Testpublic void testB_UpdateProduct() {// 注意表中的外鍵關系,確保這些數據在對應的表中的存在ProductCategory productCategory = new ProductCategory();productCategory.setProductCategoryId(36L);// 注意表中的外鍵關系,確保這些數據在對應的表中的存在Shop shop = new Shop();shop.setShopId(5L);Product product = new Product();product.setProductName("modifyProduct");product.setProductDesc("modifyProduct desc");product.setImgAddr("/mmm/ddd");product.setNormalPrice("350");product.setPromotionPrice("300");product.setPriority(66);product.setLastEditTime(new Date());product.setEnableStatus(1);product.setProductCategory(productCategory);product.setShop(shop);// 設置productIdproduct.setProductId(2L);int effectNum = productDao.updateProduct(product);Assert.assertEquals(1, effectNum);} }ProductImgDaoTest
package com.artisan.o2o.dao;import java.util.ArrayList; import java.util.Date; import java.util.List;import org.junit.Assert; import org.junit.FixMethodOrder; import org.junit.Ignore; import org.junit.Test; import org.junit.runners.MethodSorters; import org.springframework.beans.factory.annotation.Autowired;import com.artisan.o2o.BaseTest; import com.artisan.o2o.entity.ProductImg;/*** * * @ClassName: ProductImgDaoTest* * @Description: 測試類的執行順序可通過對測試類添加注解@FixMethodOrder(value) 來指定* * @author: Mr.Yang* * @date: 2018年6月30日 下午3:28:28*/ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class ProductImgDaoTest extends BaseTest {@Autowiredprivate ProductImgDao productImgDao;/*** 加入@Ignore 可以不執行該單元測試方法*/@Test@Ignorepublic void testBatchInsertProductImg() {ProductImg productImg1 = new ProductImg();productImg1.setImgAddr("/xiaogongjiang/xxxx");productImg1.setImgDesc("商品詳情圖片1");productImg1.setPriority(99);productImg1.setCreateTime(new Date());productImg1.setProductId(2L);ProductImg productImg2 = new ProductImg();productImg2.setImgAddr("/artisan/xxxx");productImg2.setImgDesc("商品詳情圖片2");productImg2.setPriority(98);productImg2.setCreateTime(new Date());productImg2.setProductId(2L);// 添加到productImgList中List<ProductImg> productImgList = new ArrayList<ProductImg>();productImgList.add(productImg1);productImgList.add(productImg2);// 調用接口批量新增商品詳情圖片int effectNum = productImgDao.batchInsertProductImg(productImgList);Assert.assertEquals(2, effectNum);}@Testpublic void testA_BatchInsertProductImg() {ProductImg productImg1 = new ProductImg();productImg1.setImgAddr("/xxx/xxx");productImg1.setImgDesc("商品詳情圖片1x");productImg1.setPriority(88);productImg1.setCreateTime(new Date());productImg1.setProductId(3L);ProductImg productImg2 = new ProductImg();productImg2.setImgAddr("/yyy/yyyy");productImg2.setImgDesc("商品詳情圖片2y");productImg2.setPriority(66);productImg2.setCreateTime(new Date());productImg2.setProductId(3L);// 添加到productImgList中List<ProductImg> productImgList = new ArrayList<ProductImg>();productImgList.add(productImg1);productImgList.add(productImg2);// 調用接口批量新增商品詳情圖片int effectNum = productImgDao.batchInsertProductImg(productImgList);Assert.assertEquals(2, effectNum);}@Testpublic void testB_DeleteProductImgById() {Long productId = 3L;int effectNum = productImgDao.deleteProductImgById(productId);Assert.assertEquals(2, effectNum);} }單元測試通過.可以看到是按照方法名的升序順序執行的,形成一個閉環。
SQL日志如下
JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5bf8fa12] will not be managed by Spring ==> Preparing: INSERT INTO tb_product_img ( img_addr, img_desc, priority, create_time, product_id ) VALUES ( ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ? ) ==> Parameters: /xxx/xxx(String), 商品詳情圖片1x(String), 88(Integer), 2018-06-30 21:26:34.455(Timestamp), 3(Long), /yyy/yyyy(String), 商品詳情圖片2y(String), 66(Integer), 2018-06-30 21:26:34.455(Timestamp), 3(Long) <== Updates: 2 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7a67e3c6] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1921ad94] was not registered for synchronization because synchronization is not active JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@30af5b6b] will not be managed by Spring ==> 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: 3(Long) <== Columns: product_img_id, img_addr, img_desc, priority, create_time, product_id <== Row: 16, /xxx/xxx, 商品詳情圖片1x, 88, 2018-06-30 21:26:34.0, 3 <== Row: 17, /yyy/yyyy, 商品詳情圖片2y, 66, 2018-06-30 21:26:34.0, 3 <== Total: 2 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1921ad94] ProductImg [productImgId=16, imgAddr=/xxx/xxx, imgDesc=商品詳情圖片1x, priority=88, createTime=Sat Jun 30 21:26:34 BOT 2018, productId=3] ProductImg [productImgId=17, imgAddr=/yyy/yyyy, imgDesc=商品詳情圖片2y, priority=66, createTime=Sat Jun 30 21:26:34 BOT 2018, productId=3] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@535779e4] was not registered for synchronization because synchronization is not active JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@6c0d9d86] will not be managed by Spring ==> Preparing: DELETE FROM tb_product_img WHERE product_id = ? ==> Parameters: 3(Long) <== Updates: 2 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@535779e4]Github地址
代碼地址: https://github.com/yangshangwei/o2o
總結
以上是生活随笔為你收集整理的实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实战SSM_O2O商铺_31【商品】商品
- 下一篇: 实战SSM_O2O商铺_33【商品】商品