分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

web项目的分页

发布时间:2023-09-06 02:17责任编辑:胡小海关键词:暂无标签

在web项目中,分页应用最普遍,简单记录一下我在实际项目中使用的分页思路;

1、RowBounds分页,这种分页不推荐使用,RowBounds在处理分页时,只是简单的把offset之前的数据都skip掉,超过limit之后的数据不取出,简单点说,就是先把数据全部查询到ResultSet,然后从ResultSet中取出offset和limit之间的数据,这 就实现了分页查询。Mysql中可以使用limit语句,但limit并不是标准SQL中的,如果是其它的数据库,则需要使用其它语句。

2、一般项目中使用mybatis逆向工程生成类和映射文件,所以可以使用Page工具类和自动生成 的..Example相结合,来完成页面的分页显示,多条件查询,多条件排序等。

3、还可以使用paperhelper分页插件进行分页查询,功能很强大。

4、排序在分页的中的应用。

//使用example.setOrderByClause("字段名1 ASC/DESC,字段名2 ASC/DESC,...");
/** ????* 分页查询 ????*/ ???@Override ???public PageInfo<Userinfo> findAllByPage(int currentPage, int pageSize) { ???????????????UserinfoExample example = new UserinfoExample(); ???????String orderByClause = "uid asc,uname desc"; ???????example.setOrderByClause(orderByClause); ???????PageHelper.startPage(currentPage, pageSize,orderByClause); ???????List<Userinfo> list = userinfoMapper.selectByExample(example); ???????PageInfo<Userinfo> pageInfo = new PageInfo<>(list); ???????return pageInfo; ???}
//在paperhelper插件中可以使用PageHelper.startPage(currentPage, pageSize,orderByClause);
/** ????* 分页查询 ????*/ ???@Override ???public PageInfo<Userinfo> findAllByPage(int currentPage, int pageSize) { ???????????????String orderByClause = "uid asc,uname desc"; ???????PageHelper.startPage(currentPage, pageSize,orderByClause); ???????List<Userinfo> list = userinfoMapper.selectByExample(null); ???????PageInfo<Userinfo> pageInfo = new PageInfo<>(list); ???????return pageInfo; ???}

5、使用Page工具类和逆向工程中的example实现分页。

  1)先创建Page类

public class Page { ???private int currentPageNo; ?// 当前页码 ???private int pageSize; ???????// 页面大小,即每页显示记录数 ???private int count; ?????????// 记录总数 ???private int sumPage; ????????// 总页数 ???List<Userinfo> userlist; ???// 每页新闻集合
  
  //计算总页数 ???public int getSumPage() { ???????return sumPage=count%pageSize==0?count/pageSize:count/pageSize+1; ???} ???//省去其他set/get方法 ???}

  2)给Example类添加参数,生成set/get方法

public class UserinfoExample { ???????????/** ????* 分页 ????*/ ???private Integer currentPage; ???private Integer pageSize; ???public Integer getPageSize() { ???????return pageSize; ???} ???public void setPageSize(Integer pageSize) { ???????this.pageSize = pageSize; ???} ???public Integer getCurrentPage() { ???????return currentPage; ???} ???public void setCurrentPage(Integer currentPage) { ???????this.currentPage = currentPage; ???}}

  3)修改mapper.xml中的selectByExample方法

//在if条件最后添加分页的判断<if test="currentPage != null and pageSize !=null and pageSize !=0"> ???????limit #{currentPage},#{pageSize}</if>

  4)service层的查询方法

/** ????* page 类 ?和example结合使用
   * 传入当前页、页大小和对象,可以实现按条件查询
   * 最后返回page对象到前台
*/ ???@Override ???public Page findAllByPageAndExample(int currentPage, int pageSize,Userinfo userinfo) { ???????Page page = new Page(); ???????page.setCount(userinfoMapper.count()); ???????????????if(currentPage ==0 ) { ???????????currentPage = 1; ???????} ???????if(pageSize ==0) { ???????????pageSize = 10; ???????} ???????page.setCurrentPageNo(currentPage); ???????page.setPageSize(pageSize); ???????//处理当前页数大于总页数的问题 ???????if(currentPage > page.getSumPage()){ ???????????currentPage = page.getSumPage(); ???????????page.setCurrentPageNo(currentPage); ???????} ???????????????//处理当前页数小于第一页的问题 ???????if(currentPage < 0){ ???????????currentPage = 1; ???????????page.setCurrentPageNo(currentPage); ???????} ???????????????//按条件查询 ???????UserinfoExample example = new UserinfoExample(); ???????Criteria ce = example.createCriteria(); ???????if(userinfo.getUname() != null && userinfo.getUname().trim().length()>0) { ???????????ce.andUnameLike("%"+userinfo.getUname()+"%"); ???????} ???????????????example.setCurrentPage((page.getCurrentPageNo()-1)*pageSize); ???????example.setPageSize(page.getPageSize()); ???????page.setUserlist(userinfoMapper.selectByExample(example)); ???????return page; ???}

  5)controller层的代码

/** ????* page 类 ?和example结合使用
   * 我这里需要实现按条件查询和设置每页显示的页大小,所以页大小的值和按条件查询的对象信息都保存在session中
   * 前台每次需要修改查询条件时,先异步请求到后台,将值set到session中,再发起请求获取数据。
*/ ???@RequestMapping("findAll") ???public String findAllByPageAndExample(Integer c,HttpServletRequest request,HttpSession session) { ???????Userinfo userinfo = (Userinfo)session.getAttribute("userinfo"); ???????if(userinfo == null) { ???????????userinfo = new Userinfo(); ???????} ???????int pageSize = (int) session.getAttribute("pageSize"); ???????Page page = userinfoServiceImpl.findAllByPageAndExample(c, pageSize,userinfo); ???????request.setAttribute("page", page); ???????request.setAttribute("userinfo", (Userinfo)session.getAttribute("userinfo")); ???????return "index"; ???}

6、paperhelper插件的使用(我创建的是maven项目)

  1)引入jar包 

<!-- 引入分页插件,paperhelper --> ???????<dependency> ???????????<groupId>com.github.pagehelper</groupId> ???????????<artifactId>pagehelper</artifactId> ???????????<version>5.1.6</version> ???????</dependency>

  2)配置mybatis.xml文件(也可以选择在spring配置文件中配置,此处在mybatis.xml文件中配置)

<!-- 配置分页插件 --> ???<plugins> ???????<plugin interceptor="com.github.pagehelper.PageInterceptor"> ???????????<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库--> ???????????<property name="helperDialect" value="mysql"/> ???????????<!-- ?reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, ????????????pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。 --> ???????????<property name="reasonable" value="true"/> ???????</plugin> ???</plugins>

  

  3)service层的描述

   同样可以传入对象,使用example实现按条件查询,paperhelper插件实现的很全,直接将PageInfo发给前台,PageInfo中就包含了分页查询的所有信息,在PageInfo中都可以拿到。

/** ????* 分页查询 ????*/ ???@Override ???public PageInfo<Userinfo> findAllByPage(int currentPage, int pageSize) { ???????????????UserinfoExample example = new UserinfoExample(); ???????String orderByClause = "uid asc,uname desc"; ???????example.setOrderByClause(orderByClause); ???????PageHelper.startPage(currentPage, pageSize); ???????List<Userinfo> list = userinfoMapper.selectByExample(example); ???????PageInfo<Userinfo> pageInfo = new PageInfo<>(list); ???????return pageInfo; ???}

  4)controller层

@RequestMapping("findAll") ???public String findAll(int currentPage,int pageSize ,HttpSession session,HttpServletRequest request) { ???????????????PageInfo<Userinfo> pageInfo = userinfoServiceImpl.findAllByPage(currentPage, pageSize); ???????request.setAttribute("pageInfo", pageInfo); ???????return "index"; ???}

7、PageInfo类的属性

public class PageInfo<T> implements Serializable { ???????private static final long serialVersionUID = 1L; ???????//当前页 ???????private int pageNum; ???????//每页的数量 ???????private int pageSize; ???????//当前页的数量 ???????private int size; ??????????//当前页面第一个元素在数据库中的行号 ???????private int startRow; ???????//当前页面最后一个元素在数据库中的行号 ???????private int endRow; ???????//总记录数 ???????private long total; ???????//总页数 ???????private int pages; ???????//结果集 ???????private List<T> list; ????????//前一页 ???????private int prePage; ???????//下一页 ???????private int nextPage; ????????//是否为第一页 ???????private boolean isFirstPage = false; ???????//是否为最后一页 ???????private boolean isLastPage = false; ???????//是否有前一页 ???????private boolean hasPreviousPage = false; ???????//是否有下一页 ???????private boolean hasNextPage = false; ???????//导航页码数 ???????private int navigatePages; ???????//所有导航页号 ???????private int[] navigatepageNums; ???????//导航条上的第一页 ???????private int navigateFirstPage; ???????//导航条上的最后一页 ???????private int navigateLastPage; ????????public PageInfo() { ???} ???//省去其他方法}

web项目的分页

原文地址:https://www.cnblogs.com/newbest/p/9742492.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved