mybatis分页插件的使用(电商项目前端动态查询排序)
2017-10-13 20:02
671 查看
记得之前写过的各种各样的分页,每次编写分页逻辑都得浪费很长时间,还得调试,经常出问题。实际项目中可能会用到分页比较多的情况。可以使用拦截器分页(尚未研究),下面推荐mybatis的pagehepler插件
maven导包(第一个是肯定用到的)
分页方法的实现:
上面代码 pageResult = new PageInfo(productList);这里写productListVoList也是ok的,但是前提是要保证mybatispagehelper和volist的分页是一致的。在处理vo逻辑的时候和mapper查出来的是一样的。size
如果是同一个list,set方法可以不写的
下面粘贴一下pageInfo的源码:
在电商平台中的使用:前端搜索动态排序业务
@controller层
@RequestMapping("list.do")
@ResponseBody
public ServerResponse<PageInfo> list(@RequestParam(value = "keyword",required = false) String keyword,
@RequestParam(value = "categroyId",required = false)Integer categroyId,
@RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize,
@RequestParam(value = "orderBy",defaultValue = "") String orderBy){
return iProductService.getProductByKeywordCategroy(keyword,categroyId,pageNum,pageSize,orderBy);
}
@service层
public ServerResponse<PageInfo> getProductByKeywordCategroy(String keyword,Integer categroyId,Integer pageNum,Integer pageSize,String orderBy){
if (StringUtils.isBlank(keyword) && categroyId == null){
return ServerResponse.createByErrorMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(),ResponseCode.ILLEGAL_ARGUMENT.getDesc());
}
List<Integer> categroyIdList = new ArrayList<Integer>();
if (categroyId!=null){
Category category = categoryMapper.selectByPrimaryKey(categroyId);
if (category == null && StringUtils.isBlank(keyword)){
//没有该分类,并且还没有关键字,这时候返回一个空的结果集不报错
PageHelper.startPage(pageNum,pageSize);
List<ProductListVo> productListVoList = Lists.newArrayList();
PageInfo pageInfo = new PageInfo(productListVoList);
return ServerResponse.createBySuccess(pageInfo);
}
categroyIdList = iCategroyService.selectCategroyAndChildrenById(category.getId()).getData();
}
if (StringUtils.isNotBlank(keyword)){
keyword = new StringBuilder().append("%").append(keyword).append("%").toString();
}
PageHelper.startPage(pageNum,pageSize);
//排序处理,动态排序,和前端约定的
if (StringUtils.isNotBlank(orderBy)){
if (Const.ProductListOrderBy.PRICE_ASC_DESC.contains(orderBy)){
String[] orderByArray = orderBy.split("_");
PageHelper.orderBy(orderByArray[0] +" "+orderByArray[1]);
}
}
List<Product> productList = productMapper.selectByNameAndProductIds(StringUtils.isBlank(keyword)?null:keyword,categroyIdList.size()==0?null:categroyIdList);
List<ProductListVo> productListVoList = Lists.newArrayList();
for (Product product:productList){
ProductListVo productListVo = assembleProductListVo(product);
productListVoList.add(productListVo);
}
PageInfo pageInfo = new PageInfo(productList);
pageInfo.setList(productListVoList);
return ServerResponse.createBySuccess(pageInfo);
}const公共类(和前端约定配置:price_desc降序 price_asc升序):
public interface ProductListOrderBy{
Set<String> PRICE_ASC_DESC = Sets.newHashSet("price_desc","price_asc");
}
mybatis Dao层接口
List<Product> selectByNameAndProductIds(@Param("productName") String productName,@Param("categroyIdList")List<Integer> categroyIdList);
mybatis xml实现:
<select id="selectByNameAndProductIds" resultMap="BaseResultMap" parameterType="map">
select
<include refid="Base_Column_List"/>
from mmall_product
where status = 1
<if test="productName!=null">
and name like #{productName}
</if>
<if test="categroyIdList!=null">
and category_id in
<foreach collection="categroyIdList" open="(" close=")" separator="," item="item" index="index">
#{item}
</foreach>
</if>
</select>
maven导包(第一个是肯定用到的)
<!-- mybatis pager --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>com.github.miemiedev</groupId> <artifactId>mybatis-paginator</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>0.9.4</version> </dependency>
分页方法的实现:
//分页方法 public ServerResponse<PageInfo> getProductList(int pageNum,int pageSize){ //startPage - start PageHelper.startPage(pageNum,pageSize); //填充自己的sql逻辑 //查询所有的产品 List<Product> productList = productMapper.selectList(); //将所有产品换成一个vo的对象 List<ProductListVo> productListVoList = Lists.newArrayList(); for (Product product:productList){ ProductListVo productListVo = assembleProductListVo(product); productListVoList.add(productListVo); } //pagehelper收尾 PageInfo pageResult = new PageInfo(productList); pageResult.setList(productListVoList); return ServerResponse.createBySuccess(pageResult); }
上面代码 pageResult = new PageInfo(productList);这里写productListVoList也是ok的,但是前提是要保证mybatispagehelper和volist的分页是一致的。在处理vo逻辑的时候和mapper查出来的是一样的。size
如果是同一个list,set方法可以不写的
下面粘贴一下pageInfo的源码:
/* * The MIT License (MIT) * * Copyright (c) 2014 abel533@gmail.com * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.github.pagehelper; import java.io.Serializable; import java.util.Collection; import java.util.List; /** * 对Page<E>结果进行包装 * <p/> * 新增分页的多项属性,主要参考:http://bbs.csdn.net/topics/360010907 * * @author liuzh/abel533/isea533 * @version 3.3.0 * @since 3.2.2 * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper */ @SuppressWarnings({"rawtypes", "unchecked"}) public class PageInfo<T> implements Serializable { private static final long serialVersionUID = 1L; //当前页 private int pageNum; //每页的数量 private int pageSize; //当前页的数量 private int size; //排序 private String orderBy; //由于startRow和endRow不常用,这里说个具体的用法 //可以在页面中"显示startRow到endRow 共size条数据" //当前页面第一个元素在数据库中的行号 private int startRow; //当前页面最后一个元素在数据库中的行号 private int endRow; //总记录数 private long total; //总页数 private int pages; //结果集 private List<T> list; //第一页 private int firstPage; //前一页 private int prePage; //下一页 private int nextPage; //最后一页 private int lastPage; //是否为第一页 private boolean isFirstPage = false; //是否为最后一页 private boolean isLastPage = false; //是否有前一页 private boolean hasPreviousPage = false; //是否有下一页 private boolean hasNextPage = false; //导航页码数 private int navigatePages; //所有导航页号 private int[] navigatepageNums; public PageInfo() { } /** * 包装Page对象 * * @param list */ public PageInfo(List<T> list) { this(list, 8); } /** * 包装Page对象 * * @param list page结果 * @param navigatePages 页码数量 */ public PageInfo(List<T> list, int navigatePages) { if (list instanceof Page) { Page page = (Page) list; this.pageNum = page.getPageNum(); this.pageSize = page.getPageSize(); this.orderBy = page.getOrderBy(); this.pages = page.getPages(); this.list = page; this.size = page.size(); this.total = page.getTotal(); //由于结果是>startRow的,所以实际的需要+1 if (this.size == 0) { this.startRow = 0; this.endRow = 0; } else { this.startRow = page.getStartRow() + 1; //计算实际的endRow(最后一页的时候特殊) this.endRow = this.startRow - 1 + this.size; } } else if (list instanceof Collection) { this.pageNum = 1; this.pageSize = list.size(); this.pages = 1; this.list = list; this.size = list.size(); this.total = list.size(); this.startRow = 0; this.endRow = list.size() > 0 ? list.size() - 1 : 0; } if (list instanceof Collection) { this.navigatePages = navigatePages; //计算导航页 calcNavigatepageNums(); //计算前后页,第一页,最后一页 calcPage(); //判断页面边界 judgePageBoudary(); 4000 } } /** * 计算导航页 */ private void calcNavigatepageNums() { //当总页数小于或等于导航页码数时 if (pages <= navigatePages) { navigatepageNums = new int[pages]; for (int i = 0; i < pages; i++) { navigatepageNums[i] = i + 1; } } else { //当总页数大于导航页码数时 navigatepageNums = new int[navigatePages]; int startNum = pageNum - navigatePages / 2; int endNum = pageNum + navigatePages / 2; if (startNum < 1) { startNum = 1; //(最前navigatePages页 for (int i = 0; i < navigatePages; i++) { navigatepageNums[i] = startNum++; } } else if (endNum > pages) { endNum = pages; //最后navigatePages页 for (int i = navigatePages - 1; i >= 0; i--) { navigatepageNums[i] = endNum--; } } else { //所有中间页 for (int i = 0; i < navigatePages; i++) { navigatepageNums[i] = startNum++; } } } } /** * 计算前后页,第一页,最后一页 */ private void calcPage() { if (navigatepageNums != null && navigatepageNums.length > 0) { firstPage = navigatepageNums[0]; lastPage = navigatepageNums[navigatepageNums.length - 1]; if (pageNum > 1) { prePage = pageNum - 1; } if (pageNum < pages) { nextPage = pageNum + 1; } } } /** * 判定页面边界 */ private void judgePageBoudary() { isFirstPage = pageNum == 1; isLastPage = pageNum == pages; hasPreviousPage = pageNum > 1; hasNextPage = pageNum < pages; } public int getPageNum() { return pageNum; } public void setPageNum(int pageNum) { this.pageNum = pageNum; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public String getOrderBy() { return orderBy; } public void setOrderBy(String orderBy) { this.orderBy = orderBy; } public int getStartRow() { return startRow; } public void setStartRow(int startRow) { this.startRow = startRow; } public int getEndRow() { return endRow; } public void setEndRow(int endRow) { this.endRow = endRow; } public long getTotal() { return total; } public void setTotal(long total) { this.total = total; } public int getPages() { return pages; } public void setPages(int pages) { this.pages = pages; } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } public int getFirstPage() { return firstPage; } public void setFirstPage(int firstPage) { this.firstPage = firstPage; } public int getPrePage() { return prePage; } public void setPrePage(int prePage) { this.prePage = prePage; } public int getNextPage() { return nextPage; } public void setNextPage(int nextPage) { this.nextPage = nextPage; } public int getLastPage() { return lastPage; } public void setLastPage(int lastPage) { this.lastPage = lastPage; } public boolean isIsFirstPage() { return isFirstPage; } public void setIsFirstPage(boolean isFirstPage) { this.isFirstPage = isFirstPage; } public boolean isIsLastPage() { return isLastPage; } public void setIsLastPage(boolean isLastPage) { this.isLastPage = isLastPage; } public boolean isHasPreviousPage() { return hasPreviousPage; } public void setHasPreviousPage(boolean hasPreviousPage) { this.hasPreviousPage = hasPreviousPage; } public boolean isHasNextPage() { return hasNextPage; } public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; } public int getNavigatePages() { return navigatePages; } public void setNavigatePages(int navigatePages) { this.navigatePages = navigatePages; } public int[] getNavigatepageNums() { return navigatepageNums; } public void setNavigatepageNums(int[] navigatepageNums) { this.navigatepageNums = navigatepageNums; } @Override public String toString() { final StringBuffer sb = new StringBuffer("PageInfo{"); sb.append("pageNum=").append(pageNum); sb.append(", pageSize=").append(pageSize); sb.append(", size=").append(size); sb.append(", startRow=").append(startRow); sb.append(", endRow=").append(endRow); sb.append(", total=").append(total); sb.append(", pages=").append(pages); sb.append(", list=").append(list); sb.append(", firstPage=").append(firstPage); sb.append(", prePage=").append(prePage); sb.append(", nextPage=").append(nextPage); sb.append(", lastPage=").append(lastPage); sb.append(", isFirstPage=").append(isFirstPage); sb.append(", isLastPage=").append(isLastPage); sb.append(", hasPreviousPage=").append(hasPreviousPage); sb.append(", hasNextPage=").append(hasNextPage); sb.append(", navigatePages=").append(navigatePages); sb.append(", navigatepageNums="); if (navigatepageNums == null) sb.append("null"); else { sb.append('['); for (int i = 0; i < navigatepageNums.length; ++i) sb.append(i == 0 ? "" : ", ").append(navigatepageNums[i]); sb.append(']'); } sb.append('}'); return sb.toString(); } }
在电商平台中的使用:前端搜索动态排序业务
@controller层
@RequestMapping("list.do")
@ResponseBody
public ServerResponse<PageInfo> list(@RequestParam(value = "keyword",required = false) String keyword,
@RequestParam(value = "categroyId",required = false)Integer categroyId,
@RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize,
@RequestParam(value = "orderBy",defaultValue = "") String orderBy){
return iProductService.getProductByKeywordCategroy(keyword,categroyId,pageNum,pageSize,orderBy);
}
@service层
public ServerResponse<PageInfo> getProductByKeywordCategroy(String keyword,Integer categroyId,Integer pageNum,Integer pageSize,String orderBy){
if (StringUtils.isBlank(keyword) && categroyId == null){
return ServerResponse.createByErrorMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(),ResponseCode.ILLEGAL_ARGUMENT.getDesc());
}
List<Integer> categroyIdList = new ArrayList<Integer>();
if (categroyId!=null){
Category category = categoryMapper.selectByPrimaryKey(categroyId);
if (category == null && StringUtils.isBlank(keyword)){
//没有该分类,并且还没有关键字,这时候返回一个空的结果集不报错
PageHelper.startPage(pageNum,pageSize);
List<ProductListVo> productListVoList = Lists.newArrayList();
PageInfo pageInfo = new PageInfo(productListVoList);
return ServerResponse.createBySuccess(pageInfo);
}
categroyIdList = iCategroyService.selectCategroyAndChildrenById(category.getId()).getData();
}
if (StringUtils.isNotBlank(keyword)){
keyword = new StringBuilder().append("%").append(keyword).append("%").toString();
}
PageHelper.startPage(pageNum,pageSize);
//排序处理,动态排序,和前端约定的
if (StringUtils.isNotBlank(orderBy)){
if (Const.ProductListOrderBy.PRICE_ASC_DESC.contains(orderBy)){
String[] orderByArray = orderBy.split("_");
PageHelper.orderBy(orderByArray[0] +" "+orderByArray[1]);
}
}
List<Product> productList = productMapper.selectByNameAndProductIds(StringUtils.isBlank(keyword)?null:keyword,categroyIdList.size()==0?null:categroyIdList);
List<ProductListVo> productListVoList = Lists.newArrayList();
for (Product product:productList){
ProductListVo productListVo = assembleProductListVo(product);
productListVoList.add(productListVo);
}
PageInfo pageInfo = new PageInfo(productList);
pageInfo.setList(productListVoList);
return ServerResponse.createBySuccess(pageInfo);
}const公共类(和前端约定配置:price_desc降序 price_asc升序):
public interface ProductListOrderBy{
Set<String> PRICE_ASC_DESC = Sets.newHashSet("price_desc","price_asc");
}
mybatis Dao层接口
List<Product> selectByNameAndProductIds(@Param("productName") String productName,@Param("categroyIdList")List<Integer> categroyIdList);
mybatis xml实现:
<select id="selectByNameAndProductIds" resultMap="BaseResultMap" parameterType="map">
select
<include refid="Base_Column_List"/>
from mmall_product
where status = 1
<if test="productName!=null">
and name like #{productName}
</if>
<if test="categroyIdList!=null">
and category_id in
<foreach collection="categroyIdList" open="(" close=")" separator="," item="item" index="index">
#{item}
</foreach>
</if>
</select>
相关文章推荐
- myBatis动态Sql查询与PageHelper分页插件
- 使用该JavaBean可以将数据在JSP页面中以表格的形式显示出来,并具有动态排序、动态生成查询、自动分页功能
- Mybatis 使用Mapper接口的Sql动态代码方式进行CURD和分页查询
- 基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理
- Mybatis的插件 PageHelper 分页查询使用方法
- 实用前端JS工具类(验证,AJAX请求封装,分页插件等)真实项目使用
- Mybatis使用分页插件PageHelper做分页查询
- Mybatis的插件 PageHelper 分页查询使用方法
- 电商项目(二十)项目初始化(mybatis三剑客之mybatis-pagehelper分页插件讲解)
- mybatis分页插件使用案例(前端bootstrap)
- 使用bootstraptable插件实现表格记录的查询、分页、排序操作
- 商城项目实战14:MyBatis分页插件(PageHelper)的使用以及商品列表展示
- mybatis使用pageHelper插件进行查询分页
- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理
- 使用MyBatis(12)动态SQL 完成分页查询
- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理
- Mybatis的插件 PageHelper 分页查询使用方法
- mybatis的分页插件pagehelper-fix使用、数据库分页查询模板sql、总结mysql与oracle语句的区别
- Mybatis分页插件PageHelper正确的使用方法(网上有2篇不够科学的文章)
- 使用 xsl 对 xml 文档进行动态排序,分页显示的扩展