**8-10 商品列表展示之后端开发 及分页、Service层页码转行码、浏览器输入参数,controller的接收

目录

一、Dao层

1、ProductDao接口

2、dao实现类 mapper

3、测试类

二、Service层

1、ProductService.java

2、ProductServiceImpl.java

三、Controller层

三、测试


一、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进行赋值

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值