概述
完成了商品类别的功能后,
实战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 INTO tb_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 INTO tb_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 { @Autowired ProductDao productDao; @Test public 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 { @Autowired private ProductImgDao productImgDao; @Test public 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