文章目录
概述
完成了商品类别的功能后,
实战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地址