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

简介: 实战SSM_O2O商铺_28【商品】商品添加之Dao层的实现

概述

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

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


相关文章
|
5月前
|
搜索推荐 JavaScript Java
计算机Java项目|基于SSM的个性化商铺系统
计算机Java项目|基于SSM的个性化商铺系统
|
5月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的商铺租赁管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的商铺租赁管理系统附带文章和源代码部署视频讲解等
66 7
|
5月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的超市商品管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的超市商品管理系统附带文章和源代码部署视频讲解等
41 4
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js的会员制度管理的商品营销系统附带文章和源代码设计说明文档ppt
基于ssm+vue.js的会员制度管理的商品营销系统附带文章和源代码设计说明文档ppt
44 1
|
6月前
|
Java 关系型数据库 MySQL
基于SSM的商品分类管理系统
基于SSM的商品分类管理系统
67 1
|
5月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的二手商品网站附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的二手商品网站附带文章和源代码部署视频讲解等
21 0
|
5月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的在线商品交易平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的在线商品交易平台附带文章和源代码设计说明文档ppt
76 0
|
6月前
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
|
6月前
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
|
6月前
|
SQL 测试技术
实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现
实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现
58 0