实现分页 这里提供两种方式 一种是传统的分页方式 一种是基于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
web层
pageHelper 插件 要比 传统的 简单的 很多 毕竟是插件嘛 它是对mybatis的四大对象 parameterHandler resultSetHandler statementHandler executor 进行控制 通过反射 动态代理 实现 功能的增强 类似于 过滤器的功能
不过 值得注意的是 插件 的使用 会修改底层的设计 所以 还是尽量少用插件把