1、分頁的插件也有很多,比如PageHelper,這種后端分頁框架,將數據都查詢出來,設置一下起始頁,每頁顯示的數據就行了,操作起來十分方便。還有前端分頁插件,DisplayTag,將數據查詢出來以后,用前端分頁插件展示數據,設置一下起始頁,每頁顯示的數據就行了,做課設、畢設再爽不過了。還有很多其他分頁插件,都是大神封裝好的,既然不會造輪子,就先學會熟練使用輪子吧。
開源屆有一句經典的話,不要重復發明輪子。意思就是有現成的成熟實現就用它,不要自己從頭實現一遍。
所以,相反的重新實現已有的模塊(為了鍛煉技術,或者得到更好的性能)就叫重復發明輪子,造輪子。
2、分頁插件,很多很多,但是有的時候,項目比較急,或者這些分頁插件不是很適合你的項目,這個適合最好使用一個Java封裝的分頁工具類,快速實現你分頁的效果。
1 package com.bie.utils; 2 3 import java.util.List; 4 5 /** 6 * 使用泛型可以傳入任何類型的實體類 7 * 8 * @ProjectName: nationalpolicy 9 * @Package: com.bie.utils 10 * @ClassName: PageBean 11 * @Author: biehl 12 * @Description: 使用泛型可以傳入任何類型的實體類 13 * @Date: 2020/2/28 18:57 14 * @Version: 1.0 15 */ 16 public class PageBean<T> { 17 18 19 private List<T> lists;// 存放需要顯示的實體類數據 20 private Integer pageNo = 1;// 當前頁碼數(默認給1),需要傳參 21 private Integer pageSize; // 每頁顯示的行數,需要傳參 22 // this.totalPage = rows % pageSize == 0 ? rows / pageSize : (rows / pageSize + 1); 23 private Integer totalPage;// 總頁數,是根據總行數和每頁顯示的行數計算出來的結果 24 private Integer rows;// 總行數,總行數是查詢出來的數據表總記錄數 25 26 // 對私有屬性的封裝 27 // 不需要對外提供totalPage總頁數的set設值方法,因為totalPage是根據總行數和每頁顯示的行數求出來的 28 public List<T> getLists() { 29 return lists; 30 } 31 32 public void setLists(List<T> lists) { 33 this.lists = lists; 34 } 35 36 public Integer getPageNo() { 37 return pageNo; 38 } 39 40 public Integer getPageSize() { 41 return pageSize; 42 } 43 44 public void setPageSize(Integer pageSize) { 45 this.pageSize = pageSize; 46 } 47 48 public Integer getTotalPage() { 49 return totalPage; 50 } 51 52 public Integer getRows() { 53 return rows; 54 } 55 56 /** 57 * 設置總行數據並求出總頁數 58 * 59 * @param rows 此參數是總行數 60 */ 61 public void setRows(Integer rows) { 62 this.rows = rows; 63 //頁數根據傳入的總行數以及每頁顯示的行數,求出總頁數 64 this.totalPage = rows % pageSize == 0 ? rows / pageSize : (rows / pageSize + 1); 65 } 66 67 /** 68 * 設置頁碼 69 * 70 * @param pageNo 當前頁數 71 */ 72 public void setPageNo(Integer pageNo) { 73 //如果傳入的頁碼為空或者小於0 就默認給1 74 if (null == pageNo || pageNo < 0) { 75 this.pageNo = 1; 76 //如果當前頁碼數大於總頁碼數,就讓當前頁碼數等於最大頁碼數 77 } else if (pageNo > this.totalPage && this.totalPage > 0) { 78 this.pageNo = this.totalPage; 79 //都符合條件就讓當前頁碼數等於傳入的頁碼數 80 } else { 81 this.pageNo = pageNo; 82 } 83 } 84 85 }
3、既然分頁工具類已經封裝好了,那么如何調用該工具類呢,如下所示:
由於設計到業務,所以用xxx代替了,哈哈哈,湊活看吧。
1 package com.bie.controller; 2 3 import com.bie.po.RxxxPxxxxx; 4 import com.bie.service.RxxxPxxxxxService; 5 import com.bie.service.RxxxPxxxxxThemeService; 6 import com.bie.utils.PageBean; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.stereotype.Controller; 9 import org.springframework.web.bind.annotation.RequestMapping; 10 import org.springframework.web.bind.annotation.RequestMethod; 11 import org.springframework.web.bind.annotation.RequestParam; 12 import org.springframework.web.bind.annotation.ResponseBody; 13 14 import java.util.List; 15 16 /** 17 * @ProjectName: nxxxxxpxxxxxx 18 * @Package: com.bie.controller 19 * @ClassName: RxxxPxxxxxController 20 * @Author: biehl 21 * @Description: ${description} 22 * @Date: 2020/2/28 19:42 23 * @Version: 1.0 24 */ 25 @Controller 26 @RequestMapping(value = "/xxxxxx") 27 public class RxxxPxxxxxController { 28 29 @Autowired 30 private RxxxPxxxxxService rxxxPxxxxxService; 31 32 @Autowired 33 private RxxxPxxxxxThemeService rxxxPxxxxxThemeService; 34 35 36 /** 37 * @param aaa 38 * @param bbb 39 * @param ccc 40 * @param ddd 41 * @param current 當前頁,默認是第一頁,從1開始 42 * @param size 每頁多少,默認是每頁20條數據 43 * @return 44 */ 45 @RequestMapping(value = "/xxxxxxxxx/xxxxx", method = RequestMethod.GET) 46 @ResponseBody 47 public List<RxxxPxxxxx> selectRxxxPxxxxxPageBean(@RequestParam(value = "aaa", required = false) String aaa, @RequestParam(value = "bbb", required = false) String bbb, @RequestParam(value = "ccc", required = false) String ccc, @RequestParam(value = "ddd", required = false) String ddd, @RequestParam(value = "current", defaultValue = "1") int current, @RequestParam(value = "size", defaultValue = "20") int size) { 48 // 得到數據表中的行數 49 int count = rxxxPxxxxxService.selectRxxxPxxxxxPageBeanCount(); 50 // 創建工具類對象 51 PageBean<RxxxPxxxxx> pager = new PageBean<>(); 52 // 每頁顯示的行數 53 pager.setPageSize(size); 54 // 設置總行數 55 pager.setRows(count); 56 // 設置當前頁數 57 pager.setPageNo(current); 58 // 計算出總頁數 59 int totalPage = count % size == 0 ? count / size : (count / size + 1); 60 // mysql獲取分頁第一個參數 (pager.getPageNo() - 1) * pager.getPageSize(); 61 // 獲取分頁第一個參數 62 // Limit接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數, 63 // 第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。 64 // 初始記錄行的偏移量是 0(而不是 1)。 65 int first = (pager.getPageNo() - 1) * pager.getPageSize(); 66 //調用service層將分頁的兩個參數傳遞過去 67 List<RxxxPxxxxx> rxxxPxxxxxs = rxxxPxxxxxService.selectRxxxPxxxxxPageBean(aaa, bbb, ccc, ddd, first, pager.getPageSize()); 68 69 70 // 將得到的集合對象放到PagerBean類里,這里面主要看你需要返回什么格式的數據,可以根據需要返回的格式進行封裝即可 71 pager.setLists(rxxxPxxxxxs); 72 List<RxxxPxxxxx> lists = pager.getLists(); 73 return lists; 74 75 // 如果是需要其他格式的返回類型,在下面可以封裝返回的邏輯或者在業務層封裝返回的邏輯 76 // 封裝返回結果,如果返回的是下面格式的數據,返回類型換成NxxxxxxxPxxxxxxxResult即可。 77 // List<RxxxPxxxxx> resultLists = new ArrayList<>(); 78 // if (rxxxPxxxxxs != null && rxxxPxxxxxs.size() > 0 && !rxxxPxxxxxs.isEmpty()) { 79 // for (RxxxPxxxxx rxxxPxxxxx : rxxxPxxxxxs) { 80 // RxxxPxxxxx rxxxPxxxxx1 = new RxxxPxxxxx(); 81 // // 獲取到policyId 82 // int policyId = rxxxPxxxxx.getId(); 83 // // 封裝主題信息 84 // List<RxxxPxxxxxTheme> rxxxPxxxxxThemes = rxxxPxxxxxThemeService.selectRxxxPxxxxxThemeByPolicyId(policyId); 85 // if (rxxxPxxxxxThemes != null && rxxxPxxxxxThemes.size() > 0 && !rxxxPxxxxxThemes.isEmpty()) { 86 // int[] themeIds = new int[rxxxPxxxxxThemes.size()]; 87 // for (int i = 0; i < rxxxPxxxxxThemes.size(); i++) { 88 // int themeId = rxxxPxxxxxThemes.get(i).getThemeId(); 89 // themeIds[i] = themeId; 90 // } 91 // rxxxPxxxxx1.setThemeIds(themeIds); 92 // } 93 // 94 // // 封裝themeIds 95 // rxxxPxxxxx1.setId(rxxxPxxxxx.getId()); 96 // rxxxPxxxxx1.setAaa(rxxxPxxxxx.getAaa()); 97 // rxxxPxxxxx1.setBbb(rxxxPxxxxx.getBbb()); 98 // rxxxPxxxxx1.setCcc(rxxxPxxxxx.getCcc()); 99 // rxxxPxxxxx1.setDdd(rxxxPxxxxx.getDdd()); 100 // rxxxPxxxxx1.setEee(rxxxPxxxxx.getEee()); 101 // rxxxPxxxxx1.setFff(rxxxPxxxxx.getFff()); 102 // rxxxPxxxxx1.setGgg(rxxxPxxxxx.getGgg()); 103 // rxxxPxxxxx1.setIii(rxxxPxxxxx.getIii()); 104 // 105 // resultLists.add(rxxxPxxxxx1); 106 // } 107 // } 108 // 109 // RxxxPxxxxxResult rxxxPxxxxxResult = new RxxxPxxxxxResult(); 110 // rxxxPxxxxxResult.setRecords(resultLists); 111 // rxxxPxxxxxResult.setTotal(count); 112 // rxxxPxxxxxResult.setSize(size); 113 // rxxxPxxxxxResult.setCurrent(current); 114 // rxxxPxxxxxResult.setOrders(new int[0]); 115 // rxxxPxxxxxResult.setSearchCount(true); 116 // rxxxPxxxxxResult.setPages(totalPage); 117 // 118 // NxxxxxxxPxxxxxxxResult nationalPolicyResult = new NxxxxxxxPxxxxxxxResult(); 119 // NxxxxxxxPxxxxxxxResult result = new NxxxxxxxPxxxxxxxResult(); 120 // if (resultLists != null && resultLists.size() > 0 && !resultLists.isEmpty()) { 121 // result = nationalPolicyResult.success(rxxxPxxxxxResult); 122 // } else { 123 // result = nationalPolicyResult.build(1, "fail"); 124 // } 125 // return result; 126 } 127 }
4、既然分頁工具類也封裝好了,怎么調用也寫好了,那么mysql怎么寫的呢,這里使用的mybatis。
由於設計到業務,這里面只留了大概的架子,基本可以看得懂,就不再敘述了。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 <mapper namespace="com.bie.mapper.RxxxPxxxxxMapper"> 5 6 <resultMap id="BaseResultMap" type="com.bie.po.RxxxPxxxxx"> 7 <result column="id" jdbcType="INTEGER" property="id"/> 8 <result column="aaa" jdbcType="VARCHAR" property="aaa"/> 9 <result column="bbb" jdbcType="VARCHAR" property="bbb"/> 10 <result column="ccc" jdbcType="VARCHAR" property="ccc"/> 11 <result column="ddd" jdbcType="VARCHAR" property="ddd"/> 12 </resultMap> 13 14 <sql id="sql_where"> 15 <where> 16 <if test="aaa != null and aaa != '' "> 17 a.aaa = #{aaa} 18 </if> 19 <if test="bbb != null and bbb !='' "> 20 and 21 a.id = b.policy_id 22 and 23 b.bbb = #{bbb} 24 </if> 25 <if test="ccc != null and ccc !='' "> 26 and a.ccc = #{ccc} 27 </if> 28 <if test="ddd != null and ddd !='' "> 29 and a.ddd LIKE CONCAT('%',#{ddd},'%') 30 </if> 31 </where> 32 33 </sql> 34 35 <sql id="sql_from"> 36 FROM rxxxpxxx a,rxxxpxxxxxtxxxxx b 37 <include refid="sql_where"></include> 38 </sql> 39 40 41 <select id="selectRxxxPxxxxxPageBean" resultMap="BaseResultMap"> 42 <![CDATA[ 43 SELECT * 44 ]]> 45 <include refid="sql_from"></include> 46 <![CDATA[ 47 ORDER BY a.pxxxx_time DESC 48 limit #{current}, #{size} 49 ]]> 50 </select> 51 52 <!-- 分頁查詢的count --> 53 <select id="selectRxxxPxxxxxPageBeanCount" resultType="int"> 54 <![CDATA[ 55 SELECT COUNT(*) from rxxxpxxx 56 ]]> 57 </select> 58 59 </mapper>
作者:別先生
博客園:https://www.cnblogs.com/biehongli/
如果您想及時得到個人撰寫文章以及著作的消息推送,可以掃描上方二維碼,關注個人公眾號哦。