- 首先肯定要根据productId查到对应Product相关的信息,既然这里是Dao层的开发,所以需要在Dao层需要开发一个 selectProductById 方法
- 商品信息有商品缩略图和详情图片,这里我们先约定好:如果用户传入了新的商品缩略图和详情图片,就将原有的商品缩略图和详情图片删除掉
- 商品缩略图的地址存放在tb_product的img_addr字段,所以只需要更新改表即可。 所以对应Dao层应该有个方法updateProduct
- 图片缩略图还涉及磁盘上的文件的删除,需要根据productId获取到Product ,然后获取Product的imgAddr属性,复用selectProductById 解渴
- 详情图片的地址存放在tb_product_img中,根据product_id可以查找到对应商品下的全部详情图片,所以对应Dao层应该有个方法deleteProductImgById
- 图片详情还涉及磁盘上的文件的删除,需要根据productId获取到
List<ProductImg> ,然后遍历该list,获取集合中每个ProductImg的imgAddr地址,所以还需要有个selectProductImgList方法
ProductDao层
1 /**
2 * 通过productId查询唯一的商品信息
3 * @param productId
4 * @return
5 */
6 Product queryProductById(long productId);
7
8 /**
9 * 更新商品信息
10 * @param product
11 * @return
12 */
13 int updateProduct(Product product);
ProductDao映射文件
<?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.ryanxu.o2o.dao.ProductDao">
<resultMap id="productMap"
type="com.ryanxu.o2o.entity.Product">
<id column="product_id" property="productId" />
<!-- property对应实体类中的属性名 column 对应库表中的字段名 -->
<result column="product_name" property="productName" />
<result column="product_desc" property="productDesc" />
<result column="img_addr" property="imgAddr" />
<result column="normal_price" property="normalPrice" />
<result column="promotion_price" property="promotionPrice" />
<result column="priority" property="priority" />
<result column="create_time" property="createTime" />
<result column="last_edit_time" property="lastEditTime" />
<result column="enable_status" property="enableStatus" />
<!-- 一对一使用association product中的属性为productCategory, 通过数据库中的product_category_id关联起来的
类型为 com.ryanxu.o2o.entity.ProductCategory -->
<association property="productCategory"
column="product_category_id"
javaType="com.ryanxu.o2o.entity.ProductCategory">
<!-- 对应ProductCategory中的属性 和 tb_product_category的字段 -->
<id column="product_category_id" property="productCategoryId" />
<result column="product_category_name"
property="productCategoryName" />
</association>
<!-- 一对一使用association product中的属性为shop, 通过数据库中的shop_id关联起来的 类型为com.ryanxu.o2o.entity.Shop -->
<association property="shop" column="shop_id"
javaType="com.ryanxu.o2o.entity.Shop">
<id column="shop_id" property="shopId" />
<!-- 对应Shop中的属性 和 tb_shop的字段 ,如果是符合对象,使用xx.xxx的方式 -->
<result column="owner_id" property="owner.userId" />
<result column="shop_name" property="shopName" />
</association>
<!-- 一对多使用collection product中的属性为productImgList,并且是通过库表中的product_id关联起来的,
保存的类型为com.ryanxu.o2o.entity.ProductImg -->
<collection property="productImgList" column="product_id"
ofType="com.ryanxu.o2o.entity.ProductImg">
<id column="product_img_id" property="productImgId" />
<result column="img_addr" property="imgAddr" />
<result column="img_desc" property="imgDesc" />
<result column="priority" property="priority" />
<result column="create_time" property="createTime" />
<result column="product_id" property="productId" />
</collection>
</resultMap>
<insert id="insertProduct"
parameterType="com.ryanxu.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>
<select id="queryProductById" resultMap="productMap"
parameterType="Long">
<!-- 具体的sql -->
SELECT
p.product_id,
p.product_name,
p.product_desc,
p.img_addr,
p.normal_price,
p.promotion_price,
p.priority,
p.create_time,
p.last_edit_time,
p.enable_status,
p.product_category_id,
p.shop_id,
pm.product_img_id,
pm.img_addr,
pm.img_desc,
pm.priority,
pm.create_time
FROM
tb_product p
<!-- 左连接LEFT JOIN,(即使该商品没有商品详情图片,也要查询出来该商铺) -->
LEFT JOIN
tb_product_img pm
ON
p.product_id =pm.product_id
WHERE
p.product_id = #{productId}
ORDER BY
pm.priority DESC
</select>
<update id="updateProduct"
parameterType="com.ryanxu.o2o.entity.Product">
UPDATE
tb_product
<set>
<!-- 注意后面的逗号 -->
<if test="productName !=null ">product_name = #{productName},</if>
<if test="productDesc !=null ">product_desc = #{productDesc},</if>
<if test="imgAddr !=null ">img_addr = #{imgAddr},</if>
<if test="normalPrice != null ">normal_price = #{normalPrice},</if>
<if test="promotionPrice != null ">promotion_price = #{promotionPrice},</if>
<if test="priority != null">priority = #{priority},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="lastEditTime != null">last_edit_time = #{lastEditTime},</if>
<if test="enableStatus != null ">enable_status = #{enableStatus},</if>
<!-- 注意如果是引用的复杂对象的写法 -->
<if
test="productCategory != null and productCategory.productCategoryId != null ">product_category_id = #{productCategory.productCategoryId},
</if>
</set>
WHERE
product_id = #{productId}
AND
shop_id=#{shop.shopId}
</update>
</mapper>
ProductImgDao
/**
* 根据productId查询商铺对应的图片详情信息
* @param productId
* @return
*/
List<ProductImg> queryProductImgList(long productId);
/**
* 批量添加商品详情图片
* @param productImgList
* @return
*/
int batchInsertProductImg(List<ProductImg> productImgList);
/**
* 删除指定商品下的所有详情图
* @param productId
* @return
*/
int deleteProductImgByProductId(long productId);
ProductImgDao映射文件
<?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.ryanxu.o2o.dao.ProductImgDao">
<insert id="batchInsertProductImg"
parameterType="java.util.List">
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>
<delete id="deleteProductImgByProductId">
<!-- 具体的sql -->
DELETE FROM
tb_product_img
WHERE
product_id =
#{productId}
</delete>
<select id="queryProductImgList"
resultType="com.ryanxu.o2o.entity.ProductImg">
SELECT
product_img_id,
img_addr,
img_desc,
priority,
create_time,
product_id
FROM
tb_product_img
WHERE
product_id=#{productId}
ORDER BY
product_img_id
</select>
</mapper>