zoukankan      html  css  js  c++  java
  • web项目的分页

    在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() {    }
        //省去其他方法
    }
  • 相关阅读:
    Educational Codeforces Round 49 (Rated for Div. 2)
    Codeforces Round #506 (Div. 3)
    multiset
    C++中substr函数的用法
    7.30 背包问题
    7.29 dp动态规划
    7.27 图论 存图 前向星 最短路 dijstra算法 SPFA算法
    7.26 搜索进阶(状压搜索,迭代加深搜索)
    7.23 深搜广搜
    7.24 二分搜索
  • 原文地址:https://www.cnblogs.com/newbest/p/9742492.html
Copyright © 2011-2022 走看看