问题

  在工作中经常会遇到分页查询,我们都知道其实分页查询也很简单,思想都是类似的,不过你见过的分页方法有哪些呢? 

详解

  

一、Easyui的分页查询
1、工具类:
Page.java:
public class Page {
  private Integer page;
  private Integer rows;
  private Integer start;
  public Integer getPage() {
    return page;
  }
  public void setPage(Integer page) {
    this.page = page;
  }
  public void setStart(Integer start) {
    this.start = start;
  }
  public Integer getRows() {
    return rows;
  }
  public void setRows(Integer rows) {
    this.rows = rows;
  }
  public Integer getStart() {
    return (page-1) * rows;
  }
}
EasyUIResult.java:
public class EasyUIResult {
  private Integer total;
  private List<?> rows;

  public EasyUIResult(Integer total, List<?> rows) {
    super();
    this.total = total;
    this.rows = rows;
  }
  public Integer getTotal() {
    return total;
  }
  public void setTotal(Integer total) {
    this.total = total;
  }
  public List<?> getRows() {
    return rows;
  }
  public void setRows(List<?> rows) {
    this.rows = rows;
  }

}
2、代码使用
UserPage.java:
public class UserPage extends Page {
  private String usercode;

  public String getUsercode() {
    return usercode;
  }

  public void setUsercode(String usercode) {
    this.usercode = usercode;
  }
}
UserController.java:
  @RequestMapping("/list")
  @ResponseBody
  public EasyUIResult listAllUser(UserPage userPage){
    List<User> list =userService.listAllUser(userPage);
    Integer total = userService.findUserCount(userPage);
    EasyUIResult result =new EasyUIResult(total, list);
    return result;
  }
UserServiceImpl.java:
  public List<User> listAllUser(UserPage userPage){
    return userMapper.findAllUsers(userPage);
  }
  public Integer findUserCount(UserPage userPage){
    return userMapper.findUserCount(userPage);
  }
UserMapper.java:
  List<User> findAllUsers(UserPage userPage);
  Integer findUserCount(UserPage userPage);
UserMapper.xml:
  <select >
    where usercode like '%${usercode}%'
    </if>
    limit #{start},#{rows}
  </select>

  <select >
    where usercode like '%${usercode}%'
    </if>
  </select>

3、总结
  easyui的页面什么都不用管,因为他会向后台传递page(pc)、rows(ps),query(url),后台返回total(总页数)和rows(list)
二、url重写(页面上不显示查询条件,拼接在url上)(goods)
1、工具类
PageBean.java:
public class PageBean<T> {
  private int pc;//当前页
  private int tp;//总页数 TR/PS
  private int tr;//总记录数
  private int ps;//每页记录数
  private String url;//查询条件
  private List<T> beanList;//当前页数据
  public int getPc() {
    return pc;
  }
  public void setPc(int pc) {
    this.pc = pc;
  }
  public int getTp() {
    return tr%ps==0?tr/ps:tr/ps+1;
  }

  >>>>>>>>>>>>
  get、set方法
  >>>>>>>>>>>>
}
Expression.java:
  public class Expression {
    private String name;
    private String operator;
    private String value;
    >>>>>>>>>>>>
    get、set方法
    >>>>>>>>>>>>
  }

PageConstants.java:
  public class PageConstants {
    public static final int BOOK_PAGE_SIZE=12;
    public static final int ORDER_PAGE_SIZE=5;
  }
2、使用方法
BookServlet.java:
  //单条件查询
  public String findByBname(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获得当前页
    int pc =getPc(request);
    //获得每页记录数
    int ps = PageConstants.BOOK_PAGE_SIZE;
    //获取查询参数
    String bname = request.getParameter("bname");
    //调用service获取pageBean
    PageBean<Book> pageBean = bookService.findByBname(bname, pc, ps);
    //获得url
    String url =getUrl(request);
    pageBean.setUrl(url);
    request.setAttribute("pageBean", pageBean);
    return"f:/jsps/book/list.jsp";
  }
  //组合查询
  public String findByCombination(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获得当前页
    int pc =getPc(request);
    //获得每页记录数
    int ps = PageConstants.BOOK_PAGE_SIZE;
    //获取查询参数
    Book book =CommonUtils.toBean(request.getParameterMap(), Book.class);
    //调用service获取pageBean
    PageBean<Book> pageBean = bookService.findByCombination(book, pc, ps);
    //获得url
    String url =getUrl(request);
    pageBean.setUrl(url);
    request.setAttribute("pageBean", pageBean);
    return"f:/jsps/book/list.jsp";
  }
  //获得url
  private String getUrl(HttpServletRequest request) {
    String url = request.getRequestURI()+"?"+request.getQueryString();
    int index =url.indexOf("&pc=");
    if(index!=-1){
      url=url.substring(0, index);
    }
    return url;
  }
//获得pc
  private int getPc(HttpServletRequest request) {
    int pc =1;
    String param =request.getParameter("pc");
    if(param!=null&&!param.trim().isEmpty()){
      try{
        pc = Integer.parseInt(param);
      }catch(RuntimeException e){};
    }
    return pc;
  }
BookService.java:
  //单条件查询
  public PageBean<Book> findByBname(String bname,int pc,int ps){
    try {
      return bookDao.findByBname(bname, pc, ps);
    } catch (SQLException e) {
      throw new RuntimeException(e);
    }
  }
  //组合查询
  public PageBean<Book> findByCombination(Book criteria,int pc,int ps){
    try {
      return bookDao.findByCombination(criteria, pc, ps);
    } catch (SQLException e) {
    throw new RuntimeException(e);
  }
}
BookDao.java
  //单条件查询
  public PageBean<Book> findByBname(String bnaem,int pc,int ps) throws SQLException{
    List<Expression> expressions = new ArrayList<Expression>();
    expressions.add(new Expression("bname", "like", "%"+bnaem+"%"));
    return findByCriteria(expressions, pc, ps);
  }
//组合查询
   public PageBean<Book> findByCombination(Book criteria,int pc,int ps) throws SQLException{
    List<Expression> exceptions = new ArrayList<Expression>();
    exceptions.add(new Expression("bname","like","%"+criteria.getBname()+"%"));
    exceptions.add(new Expression("author","like","%"+criteria.getAuthor()+"%"));
    exceptions.add(new Expression("press","like","%"+criteria.getPress()+"%"));
    return findByCriteria(exceptions, pc, ps);
   }
//通用查询
  public PageBean<Book> findByCriteria(List<Expression> expressions,int pc,int ps ) throws SQLException{
    //拼接语句和参数
    StringBuilder wheresql =new StringBuilder(" where 1=1");
    List<Object> params = new ArrayList<Object>();

    for (Expression expression : expressions) {
      wheresql.append(" and "+expression.getName())
      .append(" ").append(expression.getOperator()).append(" ");
      if(!expression.getOperator().equals("is null")){
        wheresql.append("?");
        params.add(expression.getValue());
      }
    }
    //总记录数
    String sql="select count(*) from t_book"+wheresql;
    Number number = (Number)qr.query(sql, new ScalarHandler(),params.toArray());
    int tr=number.intValue();
    //当前页记录
    sql ="select * from t_book"+wheresql+" order by orderBy limit ?,?";
    params.add((pc-1)*ps);
    params.add(ps);
    List<Book> beanList = qr.query(sql, new BeanListHandler<Book>(Book.class),params.toArray());
    //创建pagebean
    PageBean<Book> pageBean = new PageBean<Book>();
    pageBean.setPc(pc);
    pageBean.setPs(ps);
    pageBean.setTr(tr);
    pageBean.setBeanList(beanList);
    return pageBean;
  }
pager.jsp:
  %@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <script type="text/javascript">
    function _go() {
    var pc = $("#pageCode").val();//获取文本框中的当前页码
    if(!/^[1-9]\d*$/.test(pc)) {//对当前页码进行整数校验
      alert('请输入正确的页码!');
      return;
    }
    if(pc > ${pageBean.tp}) {//判断当前页码是否大于最大页
      alert('请输入正确的页码!');
      return;
    }
    location = "${pageBean.url}&pc="+pc;
  }
  </script>


  <div class="divBody">
  <div class="divContent">
  <%--上一页 --%>
  <c:choose>
    <c:when test="${pageBean.pc eq 1 }"><span class="spanBtnDisabled">上一页</span></c:when>
    <c:otherwise> <a href="${pageBean.url }&pc=${pageBean.pc -1}" class="aBtn bold">上一页</a></c:otherwise>
  </c:choose>

  <%-- 计算begin和end --%>
  <%-- 如果总页数<=6,那么显示所有页码,即begin=1 end=${pb.tp} --%>
  <%-- 设置begin=当前页码-2,end=当前页码+3 --%>
  <%-- 如果begin<1,那么让begin=1 end=6 --%>
  <%-- 如果end>最大页,那么begin=最大页-5 end=最大页 --%>


  <%-- 显示页码列表 --%>
  <c:choose>
  <c:when test="${pageBean.tp <= 6 }">
    <c:set var="begin" value="1"/>
    <c:set var="end" value="${pageBean.tp }"/>
  </c:when>
  <c:otherwise>
    <c:set var="begin" value="${pageBean.pc-2 }"/>
    <c:set var="end" value="${pageBean.pc + 3}"/>
    <c:if test="${begin < 1 }">
      <c:set var="begin" value="1"/>
      <c:set var="end" value="6"/>
    </c:if>
    <c:if test="${end > pageBean.tp }">
      <c:set var="begin" value="${pageBean.tp-5 }"/>
      <c:set var="end" value="${pageBean.tp }"/>
    </c:if>
  </c:otherwise>
  </c:choose>

  <c:forEach begin="${begin }" end="${end }" var="i">
    <c:choose>
      <c:when test="${i eq pageBean.pc }">
        <span class="spanBtnSelect">${i }</span>
      </c:when>
    <c:otherwise>
      <a href="${pageBean.url }&pc=${i}" class="aBtn">${i }</a>
    </c:otherwise>
  </c:choose>
  </c:forEach>


  <%-- 显示点点点 --%>
  <span class="spanApostrophe">...</span>


  <%--下一页 --%>
  <c:choose>
    <c:when test="${pageBean.pc eq pageBean.tp }"><span class="spanBtnDisabled">下一页</span></c:when>
    <c:otherwise><a href="${pageBean.url }&pc=${pageBean.pc+1}" class="aBtn bold">下一页</a> </c:otherwise>
  </c:choose>


  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

  <%-- 共N页 到M页 --%>
  <span>共${pageBean.tp }页</span>
  <span>到</span>
  <input type="text" class="inputPageCode" >确定</a>
  </div>
  </div>
三、表单提交分页(在页面上设置表单和条件进行查询)
1、工具类:
PageHelper.java:
  private Integer pageNum = 1;// 当前页数
  private Integer pageSize = 10;// 每页显示条数
  private Integer maxPageNum;// 总页数
  private Integer dataTotal;// 总记录数
  private List<?> list;//数据集合
  >>>>>>>>>>>>
  get、set方法
  >>>>>>>>>>>>
  public void setDataTotal(Integer dataTotal) {
    this.dataTotal = dataTotal;
    maxPageNum = (dataTotal + pageSize -1) / pageSize;
  }
  public Integer getLimitStart(Integer currentPage){
    if (currentPage != null) {
      this.pageNum = currentPage;
    }
    return (pageNum-1)*pageSize ;
  }
BaseController.java:
略:
BaseService.java:
  public abstract class BaseService<T> {
    public abstract BaseMapper<T> setBaseMapper();
    public int delete(Serializable id){
      return this.setBaseMapper().deleteByPrimaryKey(id);
    }
  public int add(T t){
    return this.setBaseMapper().insert(t);
  }
  public T get(Serializable id){
    return this.setBaseMapper().selectByPrimaryKey(id);
  }
  public int update(T t){
    return this.setBaseMapper().updateByPrimaryKey(t);
  }
  public int getCount(BaseQueryObject bqo){
    return this.setBaseMapper().count(bqo);
  }
  public List<T> list(BaseQueryObject bqo){
    return this.setBaseMapper().selectAll(bqo);
  }
  }
BaseMapper.java:
  public interface BaseMapper<T>{
    int deleteByPrimaryKey(Serializable id);
    int insert(T t);
    T selectByPrimaryKey(Serializable id);
    int updateByPrimaryKey(T t);
    int count(BaseQueryObject bqo);
    List<T> selectAll(BaseQueryObject bqo);
  }

2、使用方法:
ItemController.java:
  @RequestMapping("/item")
  @Controller
  public class ItemController extends BaseController {
    @RequiredLogin
    @RequestMapping("/manage/list")
    public String list(Integer currentPage, Model model, @ModelAttribute("iqm") ItemQueryModel iqm) {
      PageHelper ph = new PageHelper();
      iqm.setLimitStart(ph.getLimitStart(currentPage));//设置从哪开始
      iqm.setPageSize(ph.getPageSize());//设置每页显示条数
      List<Item> list = itemService.list(iqm);
      int count = itemService.getCount(iqm);
      ph.setDataTotal(count);//总记录数
      ph.setList(list);
      model.addAttribute("page", ph);
      return "manage/item/list";
    }
  }
ItemService.java:
  @Service
  public class ItemService extends BaseService<Item>{

    @Autowired
    private ItemMapper itemMapper;

    @Override
    public BaseMapper<Item> setBaseMapper() {
      return itemMapper;
    }

    public List<Item> findItemList(Integer category) {
      return itemMapper.findItemList(category);
    }
  }
ItemMapper.java
  public interface ItemMapper extends BaseMapper<Item>{
    List<Item> findItemList(@Param("category") Integer category);
  }
ItemMapper.xml
   <resultMap />
  </resultMap>

  <sql >
    id, category, name, introduction, price, unit, num, pic_old_name, pic_new_name, descp,
    state, create_time, create_user, modify_time, modify_user, delete_time, delete_user,
    del_state
  </sql>

  <sql >
      AND state = #{state}
    </if>
    </where>
  </sql>

  <select >
    LIMIT #{limitStart},#{pageSize}
    </if>
  </select>

  <select />
   </select>

  <select />
    from item
    where id = #{id,jdbcType=INTEGER}
  </select>

  <delete >
    delete from item
    where id = #{id,jdbcType=INTEGER}
  </delete>

  <insert >
    insert into item (id, category, name,
    introduction, price, unit,
    num, pic_old_name, pic_new_name,
    descp, state, create_time,
    create_user, modify_time, modify_user,
    delete_time, delete_user, del_state
    )
    values (#{id,jdbcType=INTEGER}, #{category,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
    #{introduction,jdbcType=VARCHAR}, #{price,jdbcType=INTEGER}, #{unit,jdbcType=VARCHAR},
    #{num,jdbcType=INTEGER}, #{picOldName,jdbcType=VARCHAR}, #{picNewName,jdbcType=VARCHAR},
    #{descp,jdbcType=VARCHAR}, #{state,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP},
    #{createUser,jdbcType=INTEGER}, #{modifyTime,jdbcType=TIMESTAMP}, #{modifyUser,jdbcType=INTEGER},
    #{deleteTime,jdbcType=TIMESTAMP}, #{deleteUser,jdbcType=INTEGER}, #{delState,jdbcType=INTEGER}
    )
  </insert>

  <update >
    update item
    set category = #{category,jdbcType=INTEGER},
    name = #{name,jdbcType=VARCHAR},
    introduction = #{introduction,jdbcType=VARCHAR},
    price = #{price,jdbcType=INTEGER},
    unit = #{unit,jdbcType=VARCHAR},
    num = #{num,jdbcType=INTEGER},
    pic_old_name = #{picOldName,jdbcType=VARCHAR},
    pic_new_name = #{picNewName,jdbcType=VARCHAR},
    descp = #{descp,jdbcType=VARCHAR},
    state = #{state,jdbcType=INTEGER},
    create_time = #{createTime,jdbcType=TIMESTAMP},
    create_user = #{createUser,jdbcType=INTEGER},
    modify_time = #{modifyTime,jdbcType=TIMESTAMP},
    modify_user = #{modifyUser,jdbcType=INTEGER},
    delete_time = #{deleteTime,jdbcType=TIMESTAMP},
    delete_user = #{deleteUser,jdbcType=INTEGER},
    del_state = #{delState,jdbcType=INTEGER}
    where id = #{id,jdbcType=INTEGER}
  </update>


  <select >暂无数据</td>
  </tr>
  </c:if>
  </tbody>
  </table>
-------------------------------------------------------------------------------------------------------------------------------------

  <!-- 分页信息-->
  <c:if test="${page.list != null && fn:length(page.list) != 0}">
    <jsp:include page="../../common/page.jsp" />
  </c:if>

四、路径作为参数
1、工具类:
BaseController.java:
public class BaseController {
  //分页
  public Integer pageNum = 1;
  public Integer pageCount = 20;//每页显示条数
  public Integer maxPageNum;//总页数
  public Integer dataTotal;//总记录数

  //设置总条数
  protected void setDataTotal(int dataTotal){
    this.dataTotal = dataTotal ;
    maxPageNum = (dataTotal + pageCount -1) / pageCount;
  }

  //前5后4的算法
  protected int[] getBeginAndEnd(Integer currentPage) {
    int[] pagelen=new int[2];
    int totalPage = maxPageNum;
    int begin = 1;
    int end = totalPage == 0 ? 1 : totalPage;//如果最大页码数为0,则end=1,否则end=最大页码数,
    if((end - begin) <= 9){
      //显示十个页码,不足十个不做处理
    }else{
      if((currentPage - begin) >= 5){
        if((currentPage+4) >= totalPage){
          end = totalPage;
          begin = end - 9;
        }else{
          end = currentPage + 4;
          begin = currentPage -5;
        }
      }else{
        if((currentPage -5) >= 1){
          begin = currentPage - 5;
          end = begin + 9;
      }else{
          begin = 1;
          end=begin + 9;
      }
    }
  }
    pagelen[0] = begin;
    pagelen[1] = end;
    return pagelen;
    }
  }
PageVo.java:
public class PageVO {
  private Integer start;//从哪开始
  private Integer pageCount;//每页显示条数
  private Integer type;//类型
  private String q; //为查询扩展一个字段
  >>>>>>>>>>>>>>>
  set\get
  >>>>>>>>>>>>>>>
}
2、如何使用工具
HomeController.java:
  @RequestMapping(value="/{type}/page/{currentPage}",method=RequestMethod.GET)
  public String findItem(@PathVariable("type") int type,@PathVariable("currentPage")Integer currentPage,Model model){
    //分页查询
    PageVO pageVO = new PageVO();
    pageVO.setStart((currentPage-1)*pageCount);//从哪开始
    pageVO.setPageCount(pageCount);//每页显示条数
    pageVO.setType(type);//模块类型
    List<Home> list = homeService.getAllByHomeType(pageVO);
    model.addAttribute("list", list);
    model.addAttribute("item", Home.hometypeMap.get(type));
    model.addAttribute("modular", "首页");//模块
    //分页信息
    //设置总数
    Integer count = homeService.getCountByType(type);
    setDataTotal(count);
    int[] arr = getBeginAndEnd(currentPage);//起始页和结束页
    int start = arr[0];//起始页
    int end = arr[1];//结束页
    model.addAttribute("start", start);
    model.addAttribute("end", end);
    model.addAttribute("type", type);//把type带到页面,为了分页请求
    model.addAttribute("currentPage", currentPage);//把当前页带到页面,为了控制样式
    return "home/item";
  }

  @RequestMapping("/search")
  public String search(String q,Integer currentPage,Model model){
    //分页查询
    PageVO pageVO = new PageVO();
    if (currentPage == null) {
      currentPage = 1;
    }
    q = (q == null ? "请输入关键字" : q.trim());
    pageVO.setStart((currentPage-1)*pageCount);//从哪开始
    pageVO.setPageCount(pageCount);//每页显示条数
    pageVO.setQ(q);
    List<Home> list = homeService.getAllByTitle(pageVO);
    model.addAttribute("list", list);
    model.addAttribute("q", q);
    //分页信息
    //设置总数
    Integer count = homeService.getCountByTitle(q);
    setDataTotal(count);
    int[] arr = getBeginAndEnd(currentPage);//起始页和结束页
    int start = arr[0];//起始页
    int end = arr[1];//结束页
    model.addAttribute("start", start);
    model.addAttribute("end", end);
    model.addAttribute("currentPage", currentPage);//把当前页带到页面,为了控制样式
    return "home/query";
  }

HomeService.java:
  public List<Home> getAllByHomeType(PageVO pageVO) {
    return homeMapper.getAllByHomeType(pageVO);
  }
  public Integer getCountByType(int type) {
    return homeMapper.getCountByType(type);
  }

  public List<Home> getAllByTitle(PageVO pageVO) {
    return homeMapper.getAllByTitle(pageVO);
  }
  public Integer getCountByTitle(String title) {
    return homeMapper.getCountByTitle(title);
  }
HomeMapper.java:
  public interface HomeMapper {
    List<Home> getAllByHomeType(PageVO pageVO);
    Integer getCountByType(int homeType);

    List<Home> getAllByTitle(PageVO pageVO);
    Integer getCountByTitle(String title);
  }
HomeMaper.xml:
  <select >
  SELECT COUNT(id) FROM home WHERE homeType = #{homeType} AND delState = 0 ;
  </select>

  <select >
  AND title LIKE concat('%',#{value},'%')

  </if>
  </where>
  </select>

相关文章: