实战SSM_O2O商铺_28【商品】商品添加之Dao层的实现_SSM教程

概述

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

实战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