實現分頁 這里提供兩種方式 一種是傳統的分頁方式 一種是基於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 進行控制 通過反射 動態代理 實現 功能的增強 類似於 過濾器的功能
不過 值得注意的是 插件 的使用 會修改底層的設計 所以 還是盡量少用插件把