前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Java封装的分页工具类

使用Java封装的分页工具类

作者头像
别先生
发布2020-03-19 21:27:25
3.1K0
发布2020-03-19 21:27:25
举报
文章被收录于专栏:别先生别先生别先生

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>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档