传统方式和插件方式 分别实现 分页 功能 pageHelper 插件

  

    实现分页  这里提供两种方式  一种是传统的分页方式  一种是基于pageHelper插件 实现的分类     推荐使用后者

    前者是一般开发的方式   思路  先手动创建一个 pageUtil 工具 用于记录 分页的各种信息  然后使用繁琐的方式去调用数据 

  pageUtil  类  可以根据需要自定义

package com.imooc.project.util;
/**
 * 这里使用 传统的 方法 进行 分页 设计   需要建立一个 用于分页的信息类  用来存放分页的信息
 * @author lqf
 *
 */

import java.util.List;

public class PageUtil {
   private int currentPageNum; //当前要看那一页 
   
   private int pageSize=10 ; //每页显示的条数 
   
   private int totalSize; //总记录条数
   
   private int startIndex; //查询开始记录的索引  limit ? ?  limit的使用
   
   private int totalPageNum; //总页数 
   
   private int nextPageNum; //下一页 
   
   private int prePageNum; //上一页 
   
   private List records; //当前页的 记录集     List<User> records   返回的是 每一页中user的 集合
   
   //用于显示 页面上的 导航的 页数  用户可以自定义 
   private int startPageNum; // 起始页
   private int endPageNum ; // 结束页 
   private String url ;
   //使用构造方法。 传递 必要的 俩个参数 第一个是 页码 第二个是总记录条数   就可以获得 其他所有的数据 
   
   public PageUtil(int currentPageNum,int totalrecords)
   {
       this.currentPageNum=currentPageNum;
       this.totalSize= totalrecords ; 
       /*   
        * 1   0  - 10    limit(0,10)   
        *  2  10 - 20    limit(10,10)
        *  3 20 -30     limit(20,30)  
        *   (当前页-1 )*10 = 该页索引值   startIndex 
        *    (currentPageNum-1)*pageSize  
        */
       
       //计算开始记录的索引 
       startIndex=(currentPageNum-1)*pageSize;
       //计算总页数 
       totalPageNum=totalSize%pageSize==0?totalSize/pageSize:totalSize/pageSize+1;
       //计算开始和结束页号 这个根据自身可设计     1 2..9
       if(totalPageNum>9)
       {
           startPageNum=currentPageNum-4;
            endPageNum=currentPageNum+4;

            if(startPageNum<1)
            {
                startPageNum=1;
                endPageNum=startPageNum+8;
            }
            if(endPageNum>totalPageNum)
            {
                endPageNum=totalPageNum;
                startPageNum=endPageNum-8;
            }
       }
       else
        {
            startPageNum=1;
            endPageNum=totalPageNum;

        }
   }

   public int getStartPageNum() {
        return startPageNum;
    }


    public void setStartPageNum(int startPageNum) {
        this.startPageNum = startPageNum;
    }


    public int getEndPageNum() {
        return endPageNum;
    }


    public void setEndPageNum(int endPageNum) {
        this.endPageNum = endPageNum;
    }

//上一页
    public int getPrePageNum() {
        prePageNum=currentPageNum-1;
        
        if(prePageNum<=0)
        {
            prePageNum=1;
        }
        return prePageNum;
    }
  // 下一页
    public int getNextPageNum() {
        
        nextPageNum=currentPageNum+1;
        
        if(nextPageNum>totalPageNum)
        {
            nextPageNum=totalPageNum;
        }
        return nextPageNum;
    }

    public int getCurrentPageNum() {
        return currentPageNum;
    }

    public void setCurrentPageNum(int currentPageNum) {
        this.currentPageNum = currentPageNum;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getTotalSize() {
        return totalSize;
    }

    public void setTotalSize(int totalSize) {
        this.totalSize = totalSize;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    public int getTotalPageNum() {
        return totalPageNum;
    }

    public void setTotalPageNum(int totalPageNum) {
        this.totalPageNum = totalPageNum;
    }

    public List  getRecords() {
        return records;
    }

    public void setRecords(List  records) {
        this.records = records;
    }

    public void setPrePageNum(int prePageNum) {
        this.prePageNum = prePageNum;
    }

    public void setNextPageNum(int nextPageNum) {
        this.nextPageNum = nextPageNum;
    }


    public String getUrl() {
        return url;
    }


    public void setUrl(String url) {
        this.url = url;
    }
    
    
}

   web层  简写 

    //获得当前页 
        String num = req.getParameter("num");
        if(num==null)
        {
            num="1";
        }
        //调用pageUtil工具 
        PageUtil page= null ; 
        try {
            page=service.getAllUsers(num);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //将数据 传入 域中   并转发到users.jsp 页面中
        req.setAttribute("page", page);
        req.getRequestDispatcher("/users.jsp").forward(req, resp);

service层

  userDao userDao= new userDao() ;
     
     public static SqlSessionFactory sqlSessionFactory = null;
    //获得 工具类的信息 
     public PageUtil getAllUsers(String num) throws  Exception{
       //当前页
         int  currentPageNum=1 ;
        // trim() 消除首尾的空格
         if (num != null ) {
             currentPageNum = Integer.parseInt(num);
            System.out.println(currentPageNum);
            }
        int totalRecords =userDao.totalRecords();

        PageUtil pg = new PageUtil(currentPageNum, totalRecords);

        List<User> users = userDao.getAllUsers(pg.getStartIndex(), pg.getPageSize());

        pg.setRecords(users);

        return pg;

    }

dao

public class userDao  extends BaseDao {
  
    //获得所有的信息个数
    public  int totalRecords()  throws Exception{

        // 使用 jdbc 模板 作为数据的连接层
        int result = 0;
        Connection conn = this.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        // count(*) 返回找到的行数 count(列名) 返回一个列的数据项数 count(*) count 设置别名为 count
        String sql = "select count(*)  count from person";
        ps = conn.prepareStatement(sql);
        rs = ps.executeQuery();

        if (rs.next()) {
            result = rs.getInt("count");
        }

        return result;
    }
    //获得 对应页的信息 
    public List<User> getAllUsers(int startIndex, int pageSize) throws  Exception{
        //使用 数组获得数据 调用DBCP模板 
        QueryRunner queryRunner= new QueryRunner();
        String sql= "select * from person limit ?,?";
        List<User> users= null ; 
        //获得数据
        users=queryRunner.query(this.getConnection(), sql,new BeanListHandler<User>(User.class),new Object[]{startIndex,pageSize});
        return users;
    }

}

 *************************************************

   使用 mybatis  pageHelper 插件 来开发

     pageHelper 插件的 使用教程  

    这是pageHelper 的 开发者  在 GitHub 上的 使用教程

     https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

mybatis的配置信息   插入    pagehelper  插件

      
     <!-- 在mybatis的配置文件下 配置 pagehelper 插件    先后顺序不要错  否则会报错的  -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
         <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->   
           <property name="helperDialect" value="mysql"/>
        </plugin>
        
    </plugins>

mapper.xml

传统方式和插件方式 分别实现 分页 功能   pageHelper 插件

传统方式和插件方式 分别实现 分页 功能   pageHelper 插件

web层 

传统方式和插件方式 分别实现 分页 功能   pageHelper 插件

      pageHelper 插件 要比 传统的 简单的 很多   毕竟是插件嘛      它是对mybatis的四大对象    parameterHandler   resultSetHandler  statementHandler  executor   进行控制  通过反射  动态代理 实现 功能的增强    类似于 过滤器的功能 

  不过  值得注意的是  插件 的使用 会修改底层的设计  所以 还是尽量少用插件把