目录
一、Dao层
1、ProductDao接口
public interface ProductDao {
/**
* 查询商品列表并分页,可输入的条件有: 商品名(模糊),商品状态,店铺Id,商品类别
*
* @param productCondition
* @param beginIndex
* @param pageSize
* @return
*/
List<Product> queryProductList(@Param("productCondition") Product productCondition, @Param("rowIndex") int rowIndex,
@Param("pageSize") int pageSize);
/**
* 查询对应的商品总数
*
* @param productCondition
* @return
*/
int queryProductCount(@Param("productCondition") Product productCondition);
}
2、dao实现类 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.imooc.o2o.dao.ProductDao">
<resultMap type="com.imooc.o2o.entity.Product" id="productMap">
<id column="product_id" property="productId"/>
<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 property="productCategory" column="product_category_id" javaType="com.imooc.o2o.entity.ProductCategory">
<id column="product_category_id" property="productCategoryId"/>
<result column="product_category_name" property="productCategoryName"/>
</association>
<association property="shop" column="shop_id" javaType="com.imooc.o2o.entity.Shop">
<id column="shop_id" property="shopId"/>
<result column="owner_id" property="owner.userId"/>
<result column="shop_name" property="shopName"/>
</association>
<collection property="productImgList" column="product_id" ofType="com.imooc.o2o.entity.ProductImg">
<id column="product_img_id" property="productImgId" />
<result column="detail_img" 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>
<select id="queryProductList" resultType="com.imooc.o2o.entity.Product">
<!-- 由于这里只查product的信息,因此只用Product就行,不用productMap -->
SELECT
product_id,
product_name,
product_desc,
img_addr,
normal_price,
promotion_price,
priority,
create_time,
last_edit_time,
enable_status,
product_category_id,
shop_id
FROM
tb_product
<where>
<if
test="productCondition.shop!=null
and productCondition.shop.shopId!=null">
and shop_id = #{productCondition.shop.shopId}
</if>
<if
test="productCondition.productCategory!=null
and productCondition.productCategory.productCategoryId!=null">
and product_category_id =
#{productCondition.productCategory.productCategoryId}
</if>
<!-- 写like语句的时候 一般都会写成 like '% %' 在mybatis里面写就是应该是 like '%${name} %' 而不是
'%#{name} %' ${name} 是不带单引号的,而#{name} 是带单引号的 -->
<if test="productCondition.productName!=null">
and product_name like '%${productCondition.productName}%'
</if>
<if test="productCondition.enableStatus!=null">
and enable_status = #{productCondition.enableStatus}
</if>
</where>
ORDER BY
priority DESC
LIMIT #{rowIndex},#{pageSize};
</select>
<select id="queryProductCount" resultType="int">
SELECT count(1) FROM tb_product
<where>
<if
test="productCondition.shop!=null
and productCondition.shop.shopId!=null">
and shop_id = #{productCondition.shop.shopId}
</if>
<if
test="productCondition.productCategory!=null
and productCondition.productCategory.productCategoryId!=null">
and product_category_id =
#{productCondition.productCategory.productCategoryId}
</if>
<if test="productCondition.productName!=null">
and product_name like '%${productCondition.productName}%'
</if>
<if test="productCondition.enableStatus!=null">
and enable_status = #{productCondition.enableStatus}
</if>
</where>
</select>
</mapper>
3、测试类
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ProductDaoTest extends BaseTest {
@Autowired ProductDao productDao;
@Autowired ProductImgDao productImgDao;
@Test
public void testBQueryProductList() throws Exception{
Product productCondition = new Product();
//分页查询
List<Product> productList = productDao.queryProductList(productCondition, 0, 3);
System.out.println(productList.size());
//查询名称为测试的商品总数
int count = productDao.queryProductCount(productCondition);
System.out.println(count);
//使用模糊查询
productCondition.setProductName("测试");
productList = productDao.queryProductList(productCondition, 0, 3);
System.out.println(productList.size());
count = productDao.queryProductCount(productCondition);
System.out.println(count);
}
}
二、Service层
1、ProductService.java
public interface ProductService {
/**
* 查询商品列表并分页,可输入条件:商品名(模糊),商品状态,店铺Id,商品类别
* @param productCondition
* @param pageIndex
* @param pageSize
* @return
*/
ProductExecution getProductList(Product productCondition,int pageIndex, int pageSize);
}
2、ProductServiceImpl.java
@Service
public class ProductServiceImpl implements ProductService{
@Override
public ProductExecution getProductList(Product productCondition, int pageIndex, int pageSize) {
//页码转换成数据库行码,并调用dao层取回指定页码的商品列表
int rowIndex = PageCalculator.calculateRowIndex(pageIndex, pageSize);
List<Product> productList = productDao.queryProductList(productCondition, rowIndex, pageSize);
//基于同样的查询条件返回该查询条件下的商品总数
int count = productDao.queryProductCount(productCondition);
ProductExecution pe = new ProductExecution();
pe.setProductList(productList);
pe.setCount(count);;
return pe;
}
}
三、Controller层
pageIndex 返回哪一页的数据
pageSize 一页有多少数据
@Controller
@RequestMapping("/shopadmin")
public class ProductManagementController {
@Autowired
private ProductService productService;
@Autowired
private ProductCategoryService productCategoryService;
@RequestMapping(value="/getproductlistbyshop",method=RequestMethod.GET)
@ResponseBody
Map<String,Object> getProductListByShop(HttpServletRequest request){
Map<String,Object> modelMap = new HashMap<String,Object>();
//获取前台传来的页码
int pageIndex = HttpServletRequestUtil.getInt(request, "pageIndex");
//获取前台传来的每页要求返回的商品数上限
int pageSize = HttpServletRequestUtil.getInt(request, "pageSize");
//从当前session中获取店铺信息,主要是获取shopId
Shop currentShop = (Shop) request.getSession().getAttribute("currentShop");
//空值判断
if((pageIndex > -1) && (pageSize > -1) && (currentShop != null) && (currentShop.getShopId()!=null)) {
//获取传入的需要检索的条件,包括是否需要从某个商品类别以及模糊查找商品名去筛选某个店铺下的商品列表
//筛选条件可以排列组合
long productCategoryId = HttpServletRequestUtil.getLong(request, "productCategoryId");
String productName = HttpServletRequestUtil.getString(request, "productName");
Product productCondition = compactProductCondition(currentShop.getShopId(),productCategoryId,productName);
//传入查询条件以及分页信息进行查询,返回相应商品以及总数
ProductExecution pe = productService.getProductList(productCondition, pageIndex, pageSize);
modelMap.put("productList", pe.getProductList());
modelMap.put("count", pe.getCount());
modelMap.put("success", true);
}else {
modelMap.put("success", false);
modelMap.put("errMsg", "empty pageSize or pageIndex or shopId");
}
return modelMap;
}
private Product compactProductCondition(Long shopId, long productCategoryId, String productName) {
Product productCondition = new Product();
Shop shop = new Shop();
shop.setShopId(shopId);
productCondition.setShop(shop);
//若有指定类别的要求则添加进去
if(productCategoryId != -1L) {
ProductCategory productCategory = new ProductCategory();
productCategory.setProductCategoryId(productCategoryId);
productCondition.setProductCategory(productCategory);
}
//若有商品名模糊查询的要求则添加进去
if(productName != null) {
productCondition.setProductName(productName);
}
return productCondition;
}
}
三、测试
输入URL,使currentShop的id赋值
http://localhost:8080/o2oDemo/shopadmin/shopmanagement?shopId=1
再输入URL
http://localhost:8080/o2oDemo/shopadmin/getproductlistbyshop?pageIndex=1&pageSize=999
注意此处pageIndex 和 pageSize在URL中输入后,由controller层进行了接收 ,currentShop在session中,用第一个URL进行赋值