1、分页的插件也有很多,比如PageHelper,这种后端分页框架,将数据都查询出来,设置一下起始页,每页显示的数据就行了,操作起来十分方便。还有前端分页插件,DisplayTag,将数据查询出来以后,用前端分页插件展示数据,设置一下起始页,每页显示的数据就行了,做课设、毕设再爽不过了。还有很多其他分页插件,都是大神封装好的,既然不会造轮子,就先学会熟练使用轮子吧。
开源届有一句经典的话,不要重复发明轮子。意思就是有现成的成熟实现就用它,不要自己从头实现一遍。 所以,相反的重新实现已有的模块(为了锻炼技术,或者得到更好的性能)就叫重复发明轮子,造轮子。
2、分页插件,很多很多,但是有的时候,项目比较急,或者这些分页插件不是很适合你的项目,这个适合最好使用一个Java封装的分页工具类,快速实现你分页的效果。
代码语言:javascript复制 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代替了,哈哈哈,凑活看吧。
代码语言:javascript复制 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。
由于设计到业务,这里面只留了大概的架子,基本可以看得懂,就不再叙述了。
代码语言:javascript复制 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>