文章目录

  • 概述
  • 重温实体类
    • Prouct
    • ProductImg
  • ProductDao接口
  • Mapper配置文件
  • ProductImgDao接口
  • Mapper配置文件
  • 单元测试
  • #ProductDaoTest
    • ProductImgDaoTest
  • Github地址

概述

完成了商品类别的功能后,

实战SSM_O2O商铺_25【商品类别】商品类别列表展示从Dao到View层的开发

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

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


接下来我们继续实现商品部分的功能。

功能点:

1. 商品的添加

2. 商品图片的批量添加(主要是指商品详情部分的图片)


重温实体类

Prouct

package com.artisan.o2o.entity;import java.util.Date;
import java.util.List;public class Product {private Long productId;private String productName;private String productDesc;/*** 简略图*/private String imgAddr;/*** 原价*/private String normalPrice;/*** 折后价*/private String promotionPrice;private Integer priority;private Date createTime;private Date lastEditTime;/*** -1 不可用 0 下架 1 展示*/private Integer enableStatus;/*** 产品对应的详情列表,一对多*/private List<ProductImg> productImgList;/*** 产品所属产品目录*/private ProductCategory productCategory;/*** 产品所属店铺*/private Shop shop;// setter/gettter省略}

ProductImg

package com.artisan.o2o.entity;import java.util.Date;public class ProductImg {private Long productImgId;private String imgAddr;private String imgDesc;private Integer priority;private Date createTime;// 只需要一个productId属性,不需要获取Product的其他属性,所以这里直接使用Long类型的productId,而没有使用Product。private Long productId;// setter/gettter省略}

ProductDao接口

package com.artisan.o2o.dao;import com.artisan.o2o.entity.Product;public interface ProductDao {/*** * * @Title: insertProduct* * @Description: 增加商品* * @param product* * @return: int*/int insertProduct(Product product);
}

Mapper配置文件

<?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"><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></mapper>

ProductImgDao接口

package com.artisan.o2o.dao;import java.util.List;import com.artisan.o2o.entity.ProductImg;public interface ProductImgDao {/*** * * @Title: batchInsertProductImg* * @Description: 一个商品下可能拥有多个图片,所以这里是批量新增商品图片* * @param productImgList* * @return: int*/int batchInsertProductImg(List<ProductImg> productImgList);
}

Mapper配置文件

<?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></mapper>

单元测试

注意表之间的外键关系,确保数据之间的约束正确。

否则会引起如下类似错误

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`o2o`.`tb_product_img`, CONSTRAINT `fk_proimg_product` FOREIGN KEY (`product_id`) REFERENCES `tb_product` (`product_id`) ON DELETE CASCADE ON UPDATE CASCADE)

#ProductDaoTest

package com.artisan.o2o.dao;import java.util.Date;import org.junit.Assert;
import org.junit.Test;
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;public class ProductDaoTest extends BaseTest {@AutowiredProductDao productDao;@Testpublic void testInsertProdcut() {// 注意表中的外键关系,确保这些数据在对应的表中的存在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);}}

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.Test;
import org.springframework.beans.factory.annotation.Autowired;import com.artisan.o2o.BaseTest;
import com.artisan.o2o.entity.ProductImg;public class ProductImgDaoTest extends BaseTest {@Autowiredprivate ProductImgDao productImgDao;@Testpublic 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);}}

单元测试正常 ,测试通过


Github地址

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

实战SSM_O2O商铺_28【商品】商品添加之Dao层的实现相关推荐

  1. 实战SSM_O2O商铺_05集成SSM后验证DAO层、Service层、Controller层的配置

    文章目录 概述 验证DAO层的配置 接口 SQL映射文件 单元测试类 基类 DAO层单元测试类 验证Service层的配置 接口以及实现类 单元测试类 验证Controller层的配置 控制层 启动服 ...

  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商铺_34【商品】商品编辑之Controller层的实现

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

  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商铺_29【商品】商品添加之Service层的实现及重构

    文章目录 概述 DTO类 自定义异常 ProductService接口 重构 重构后的接口方法 接口实现类ProductServiceImpl 单元测试 Github地址 概述 步骤如下: 1.处理商 ...

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

    文章目录 概述 Service接口 Service接口实现类 单元测试 Github地址 概述 在完成了 Dao层的部分之后,顺其自然的我们来到了Service层,需要调用Dao层提供的操作数据库的方 ...

最新文章

  1. 图解Java中那18 把锁
  2. 用C#编写ActiveX控件(三) 转载
  3. docker 容器中的 uid 和 gid
  4. php构造函数里抛出异常_php-在类的构造函数中返回值
  5. 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - G.重复字符串
  6. AZURE 日志分析自动告警
  7. 边工作边刷题:70天一遍leetcode: day 73
  8. 从头写一个Cucumber测试(二) Cucumber Test
  9. java 注释标记_如何标记,像老板一样注释内容
  10. 11月17日站立会议内容
  11. 九宫格拼图小游戏代码html,js实现九宫格拼图小游戏.pdf
  12. Spring ldap ODM
  13. Rapid SCADA中文使用说明书(一)
  14. 七夕表白攻略:原来数学才是世界上最浪漫的学科!
  15. CTO说出了我的成长慢的原因,价值10万:“在VUCA时代,必须掌握的12种永久技能。”...
  16. 怎样记账才能清楚、简单
  17. 桥接模式和装饰者模式的区别及理解
  18. C语言怎样判断乘法越界,c语言算术运算符越界问题解决方案
  19. 【技术推荐】WebLogic 反序列化漏洞深入分析
  20. Delphi ord 函数

热门文章

  1. Tornado多进程启动的2种方法
  2. 人体姿态估计 自顶向下与自底向上
  3. sql array 数组基本用法(二)
  4. bigquery按照小时来聚合数据
  5. pytorch 入门(二) cnn 手写数字识别
  6. 稳定匹配算法python实现
  7. 计算机组成801pan,计算机组成06801.ppt
  8. kafka中controller的作用_Kafka 常见问题汇总
  9. 基于能量或过零率的实时语音分割--学习笔记
  10. 深度学习的基础知识(机器学习、损失函数、梯度下降、反向传播、基础模型一网打尽)