当前位置:Gxlcms > 数据库问题 > Mybatis 数据库物理分页插件 PageHelper

Mybatis 数据库物理分页插件 PageHelper

时间:2021-07-01 10:21:17 帮助过:4人阅读

.5</version> </dependency>

2. 配置分页拦截器

PageHelper的原理是基于拦截器实现的。拦截器的配置有两种方法,一种是在mybatis的配置文件中配置,一种是直接在spring的配置文件中进行:

1)在mybatis-config.xml文件中配置:

  1. <plugins>
  2. <!-- com.github.pagehelper为PageHelper类所在包名 -->
  3. <plugin interceptor=<span style="color: #800000;">"</span><span style="color: #800000;">com.github.pagehelper.PageHelper</span><span style="color: #800000;">"</span>>
  4. <property name=<span style="color: #800000;">"</span><span style="color: #800000;">dialect</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">mysql</span><span style="color: #800000;">"</span>/>
  5. <!-- 该参数默认为false -->
  6. <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
  7. <!-- 和startPage中的pageNum效果一样-->
  8. <property name=<span style="color: #800000;">"</span><span style="color: #800000;">offsetAsPageNum</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span>/>
  9. <!-- 该参数默认为false -->
  10. <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
  11. <property name=<span style="color: #800000;">"</span><span style="color: #800000;">rowBoundsWithCount</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span>/>
  12. <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
  13. <!--<span style="color: #000000;"> (相当于没有执行分页查询,但是返回结果仍然是Page类型)
  14. </span><property name=<span style="color: #800000;">"</span><span style="color: #800000;">pageSizeZero</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span>/>-->
  15. <!-- <span style="color: #800080;">3.3</span>.0版本可用 - 分页参数合理化,默认false禁用 -->
  16. <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
  17. <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
  18. <property name=<span style="color: #800000;">"</span><span style="color: #800000;">reasonable</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span>/>
  19. <!-- <span style="color: #800080;">3.5</span>.0版本可用 - 为了支持startPage(Object <span style="color: #0000ff;">params</span>)方法 -->
  20. <!-- 增加了一个`<span style="color: #0000ff;">params</span>`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
  21. <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
  22. <!--<span style="color: #000000;"> 不理解该含义的前提下,不要随便复制该配置
  23. </span><property name=<span style="color: #800000;">"</span><span style="color: #800000;">params</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">pageNum=start;pageSize=limit;</span><span style="color: #800000;">"</span>/> -->
  24. </plugin>
  25. </plugins>

这里要注意 <plugins> 在mybatis-config.xml文件中的位置,必须要符合 http://mybatis.org/dtd/mybatis-3-config.dtd 中指定的顺序:

  1. <!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?<span style="color: #000000;">,
  2. objectFactory</span>?, objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>

不然会报错。

当然mybatis-config.xml的位置,我们需要在spring的配置文件中进行指定:

  1. <bean id=<span style="color: #800000;">"</span><span style="color: #800000;">sqlSessionFactory</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">org.mybatis.spring.SqlSessionFactoryBean</span><span style="color: #800000;">"</span>>
  2. <property name=<span style="color: #800000;">"</span><span style="color: #800000;">dataSource</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">ref</span>=<span style="color: #800000;">"</span><span style="color: #800000;">dataSource</span><span style="color: #800000;">"</span> />
  3. <property name=<span style="color: #800000;">"</span><span style="color: #800000;">configLocation</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">classpath:config/mybatis-config.xml</span><span style="color: #800000;">"</span> />
  4. <property name=<span style="color: #800000;">"</span><span style="color: #800000;">mapperLocations</span><span style="color: #800000;">"</span> value=<span style="color: #800000;">"</span><span style="color: #800000;">classpath*:config/mappers/**/*.xml</span><span style="color: #800000;">"</span> />
  5. </bean>

2)如果mybatis没有mybatis-config.xml文件,那么就只能直接在spring的配置文件中配置了:

  1. <bean id=<span style="color: #800000;">"</span><span style="color: #800000;">sqlSessionFactory</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">org.mybatis.spring.SqlSessionFactoryBean</span><span style="color: #800000;">"</span>>
  2. <property name=<span style="color: #800000;">"</span><span style="color: #800000;">dataSource</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">ref</span>=<span style="color: #800000;">"</span><span style="color: #800000;">dataSource</span><span style="color: #800000;">"</span>/>
  3. <property name=<span style="color: #800000;">"</span><span style="color: #800000;">mapperLocations</span><span style="color: #800000;">"</span>>
  4. <array>
  5. <value>classpath:config/mapper<span style="color: #008000;">/*</span><span style="color: #008000;">.xml</value>
  6. </array>
  7. </property>
  8. <property name="typeAliasesPackage" value="com.test.pojo"/>
  9. <property name="plugins">
  10. <array>
  11. <bean class="com.github.pagehelper.PageHelper">
  12. <property name="properties">
  13. <value>
  14. dialect=mysql
  15. </value>
  16. </property>
  17. </bean>
  18. </array>
  19. </property>
  20. </bean></span>

到这里PageHelper所需要的配置已经完成,下面还需要在serviceImpl类中加入分页参数的代码:

3. 向拦截器传递分页参数

我们首先看下不分页的serviceImpl代码:

  1. <span style="color: #000000;">@Override
  2. </span><span style="color: #0000ff;">public</span> List<User><span style="color: #000000;"> getUserByNoAndEmail(String no, String email) {
  3. Map</span><String, Object> map = <span style="color: #0000ff;">new</span> HashMap<><span style="color: #000000;">();
  4. map.put(</span><span style="color: #800000;">"</span><span style="color: #800000;">no</span><span style="color: #800000;">"</span><span style="color: #000000;">, no);
  5. map.put(</span><span style="color: #800000;">"</span><span style="color: #800000;">email</span><span style="color: #800000;">"</span><span style="color: #000000;">, email);
  6. </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span><span style="color: #000000;">.userMapper.getUserByNoAndEmail(map);
  7. }</span>

然后我们将它改造成使用PageHelper分页:

1)首先我们根据自己项目的情况,定义一个PageBean,来保存分页之后的结果,需要哪些属性,就加入哪些属性,具体可以参考源代码中的PageInfo类的定义,其实PageInfo是插件作者给我们自己定义自己的PageBean,提供的一个参考例子。PageInfo代码如下:

  1. @SuppressWarnings({<span style="color: #800000;">"</span><span style="color: #800000;">rawtypes</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">unchecked</span><span style="color: #800000;">"</span><span style="color: #000000;">})
  2. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> PageInfo<T><span style="color: #000000;"> implements Serializable {
  3. </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> final <span style="color: #0000ff;">long</span> serialVersionUID = <span style="color: #800080;">1L</span><span style="color: #000000;">;
  4. </span><span style="color: #008000;">//</span><span style="color: #008000;">当前页</span>
  5. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> pageNum;
  6. </span><span style="color: #008000;">//</span><span style="color: #008000;">每页的数量</span>
  7. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> pageSize;
  8. </span><span style="color: #008000;">//</span><span style="color: #008000;">当前页的数量</span>
  9. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> size;
  10. </span><span style="color: #008000;">//</span><span style="color: #008000;">由于startRow和endRow不常用,这里说个具体的用法
  11. </span><span style="color: #008000;">//</span><span style="color: #008000;">可以在页面中"显示startRow到endRow 共size条数据"
  12. </span><span style="color: #008000;">//</span><span style="color: #008000;">当前页面第一个元素在数据库中的行号</span>
  13. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> startRow;
  14. </span><span style="color: #008000;">//</span><span style="color: #008000;">当前页面最后一个元素在数据库中的行号</span>
  15. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> endRow;
  16. </span><span style="color: #008000;">//</span><span style="color: #008000;">总记录数</span>
  17. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">long</span><span style="color: #000000;"> total;
  18. </span><span style="color: #008000;">//</span><span style="color: #008000;">总页数</span>
  19. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> pages;
  20. </span><span style="color: #008000;">//</span><span style="color: #008000;">结果集</span>
  21. <span style="color: #0000ff;">private</span> List<T><span style="color: #000000;"> list;
  22. </span><span style="color: #008000;">//</span><span style="color: #008000;">第一页</span>
  23. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> firstPage;
  24. </span><span style="color: #008000;">//</span><span style="color: #008000;">前一页</span>
  25. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> prePage;
  26. </span><span style="color: #008000;">//</span><span style="color: #008000;">下一页</span>
  27. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> nextPage;
  28. </span><span style="color: #008000;">//</span><span style="color: #008000;">最后一页</span>
  29. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> lastPage;
  30. </span><span style="color: #008000;">//</span><span style="color: #008000;">是否为第一页</span>
  31. <span style="color: #0000ff;">private</span> boolean isFirstPage = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
  32. </span><span style="color: #008000;">//</span><span style="color: #008000;">是否为最后一页</span>
  33. <span style="color: #0000ff;">private</span> boolean isLastPage = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
  34. </span><span style="color: #008000;">//</span><span style="color: #008000;">是否有前一页</span>
  35. <span style="color: #0000ff;">private</span> boolean hasPreviousPage = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
  36. </span><span style="color: #008000;">//</span><span style="color: #008000;">是否有下一页</span>
  37. <span style="color: #0000ff;">private</span> boolean hasNextPage = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
  38. </span><span style="color: #008000;">//</span><span style="color: #008000;">导航页码数</span>
  39. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> navigatePages;
  40. </span><span style="color: #008000;">//</span><span style="color: #008000;">所有导航页号</span>
  41. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;">[] navigatepageNums;
  42. </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
  43. * 包装Page对象
  44. *
  45. * @param list
  46. </span><span style="color: #008000;">*/</span>
  47. <span style="color: #0000ff;">public</span> PageInfo(List<T><span style="color: #000000;"> list) {
  48. </span><span style="color: #0000ff;">this</span>(list, <span style="color: #800080;">8</span><span style="color: #000000;">);
  49. }
  50. </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
  51. * 包装Page对象
  52. *
  53. * @param list page结果
  54. * @param navigatePages 页码数量
  55. </span><span style="color: #008000;">*/</span>
  56. <span style="color: #0000ff;">public</span> PageInfo(List<T> list, <span style="color: #0000ff;">int</span><span style="color: #000000;"> navigatePages) {
  57. </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (list instanceof Page) {
  58. Page page </span>=<span style="color: #000000;"> (Page) list;
  59. </span><span style="color: #0000ff;">this</span>.pageNum =<span style="color: #000000;"> page.getPageNum();
  60. </span><span style="color: #0000ff;">this</span>.pageSize =<span style="color: #000000;"> page.getPageSize();
  61. </span><span style="color: #0000ff;">this</span>.total =<span style="color: #000000;"> page.getTotal();
  62. </span><span style="color: #0000ff;">this</span>.pages =<span style="color: #000000;"> page.getPages();
  63. </span><span style="color: #0000ff;">this</span>.list =<span style="color: #000000;"> page;
  64. </span><span style="color: #0000ff;">this</span>.size =<span style="color: #000000;"> page.size();
  65. </span><span style="color: #008000;">//</span><span style="color: #008000;">由于结果是>startRow的,所以实际的需要+1</span>
  66. <span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">this</span>.size == <span style="color: #800080;">0</span><span style="color: #000000;">) {
  67. </span><span style="color: #0000ff;">this</span>.startRow = <span style="color: #800080;">0</span><span style="color: #000000;">;
  68. </span><span style="color: #0000ff;">this</span>.endRow = <span style="color: #800080;">0</span><span style="color: #000000;">;
  69. } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
  70. </span><span style="color: #0000ff;">this</span>.startRow = page.getStartRow() + <span style="color: #800080;">1</span><span style="color: #000000;">;
  71. </span><span style="color: #008000;">//</span><span style="color: #008000;">计算实际的endRow(最后一页的时候特殊)</span>
  72. <span style="color: #0000ff;">this</span>.endRow = <span style="color: #0000ff;">this</span>.startRow - <span style="color: #800080;">1</span> + <span style="color: #0000ff;">this</span><span style="color: #000000;">.size;
  73. }
  74. </span><span style="color: #0000ff;">this</span>.navigatePages =<span style="color: #000000;"> navigatePages;
  75. </span><span style="color: #008000;">//</span><span style="color: #008000;">计算导航页</span>
  76. <span style="color: #000000;"> calcNavigatepageNums();
  77. </span><span style="color: #008000;">//</span><span style="color: #008000;">计算前后页,第一页,最后一页</span>
  78. <span style="color: #000000;"> calcPage();
  79. </span><span style="color: #008000;">//</span><span style="color: #008000;">判断页面边界</span>
  80. <span style="color: #000000;"> judgePageBoudary();
  81. }
  82. }
  83. </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
  84. * 计算导航页
  85. </span><span style="color: #008000;">*/</span>
  86. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> calcNavigatepageNums() {
  87. </span><span style="color: #008000;">//</span><span style="color: #008000;">当总页数小于或等于导航页码数时</span>
  88. <span style="color: #0000ff;">if</span> (pages <=<span style="color: #000000;"> navigatePages) {
  89. navigatepageNums </span>= <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">int</span><span style="color: #000000;">[pages];
  90. </span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < pages; i++<span style="color: #000000;">) {
  91. navigatepageNums[i] </span>= i + <span style="color: #800080;">1</span><span style="color: #000000;">;
  92. }
  93. } </span><span style="color: #0000ff;">else</span> { <span style="color: #008000;">//</span><span style="color: #008000;">当总页数大于导航页码数时</span>
  94. navigatepageNums = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">int</span><span style="color: #000000;">[navigatePages];
  95. </span><span style="color: #0000ff;">int</span> startNum = pageNum - navigatePages / <span style="color: #800080;">2</span><span style="color: #000000;">;
  96. </span><span style="color: #0000ff;">int</span> endNum = pageNum + navigatePages / <span style="color: #800080;">2</span><span style="color: #000000;">;
  97. </span><span style="color: #0000ff;">if</span> (startNum < <span style="color: #800080;">1</span><span style="color: #000000;">) {
  98. startNum </span>= <span style="color: #800080;">1</span><span style="color: #000000;">;
  99. </span><span style="color: #008000;">//</span><span style="color: #008000;">(最前navigatePages页</span>
  100. <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < navigatePages; i++<span style="color: #000000;">) {
  101. navigatepageNums[i] </span>= startNum++<span style="color: #000000;">;
  102. }
  103. } </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (endNum ><span style="color: #000000;"> pages) {
  104. endNum </span>=<span style="color: #000000;"> pages;
  105. </span><span style="color: #008000;">//</span><span style="color: #008000;">最后navigatePages页</span>
  106. <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = navigatePages - <span style="color: #800080;">1</span>; i >= <span style="color: #800080;">0</span>; i--<span style="color: #000000;">) {
  107. navigatepageNums[i] </span>= endNum--<span style="color: #000000;">;
  108. }
  109. } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
  110. </span><span style="color: #008000;">//</span><span style="color: #008000;">所有中间页</span>
  111. <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < navigatePages; i++<span style="color: #000000;">) {
  112. navigatepageNums[i] </span>= startNum++<span style="color: #000000;">;
  113. }
  114. }
  115. }
  116. }
  117. </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
  118. * 计算前后页,第一页,最后一页
  119. </span><span style="color: #008000;">*/</span>
  120. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> calcPage() {
  121. </span><span style="color: #0000ff;">if</span> (navigatepageNums != <span style="color: #0000ff;">null</span> && navigatepageNums.length > <span style="color: #800080;">0</span><span style="color: #000000;">) {
  122. firstPage </span>= navigatepageNums[<span style="color: #800080;">0</span><span style="color: #000000;">];
  123. lastPage </span>= navigatepageNums[navigatepageNums.length - <span style="color: #800080;">1</span><span style="color: #000000;">];
  124. </span><span style="color: #0000ff;">if</span> (pageNum > <span style="color: #800080;">1</span><span style="color: #000000;">) {
  125. prePage </span>= pageNum - <span style="color: #800080;">1</span><span style="color: #000000;">;
  126. }
  127. </span><span style="color: #0000ff;">if</span> (pageNum <<span style="color: #000000;"> pages) {
  128. nextPage </span>= pageNum + <span style="color: #800080;">1</span><span style="color: #000000;">;
  129. }
  130. }
  131. }
  132. </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
  133. * 判定页面边界
  134. </span><span style="color: #008000;">*/</span>
  135. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> judgePageBoudary() {
  136. isFirstPage </span>= pageNum == <span style="color: #800080;">1</span><span style="color: #000000;">;
  137. isLastPage </span>= pageNum ==<span style="color: #000000;"> pages;
  138. hasPreviousPage </span>= pageNum > <span style="color: #800080;">1</span><span style="color: #000000;">;
  139. hasNextPage </span>= pageNum <<span style="color: #000000;"> pages;
  140. }
  141. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setPageNum(<span style="color: #0000ff;">int</span><span style="color: #000000;"> pageNum) {
  142. </span><span style="color: #0000ff;">this</span>.pageNum =<span style="color: #000000;"> pageNum;
  143. }
  144. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageNum() {
  145. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pageNum;
  146. }
  147. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageSize() {
  148. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pageSize;
  149. }
  150. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getSize() {
  151. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> size;
  152. }
  153. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getStartRow() {
  154. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> startRow;
  155. }
  156. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getEndRow() {
  157. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> endRow;
  158. }
  159. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">long</span><span style="color: #000000;"> getTotal() {
  160. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> total;
  161. }
  162. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPages() {
  163. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pages;
  164. }
  165. </span><span style="color: #0000ff;">public</span> List<T><span style="color: #000000;"> getList() {
  166. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> list;
  167. }
  168. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getFirstPage() {
  169. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> firstPage;
  170. }
  171. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPrePage() {
  172. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> prePage;
  173. }
  174. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getNextPage() {
  175. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> nextPage;
  176. }
  177. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getLastPage() {
  178. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> lastPage;
  179. }
  180. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> boolean isIsFirstPage() {
  181. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> isFirstPage;
  182. }
  183. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> boolean isIsLastPage() {
  184. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> isLastPage;
  185. }
  186. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> boolean isHasPreviousPage() {
  187. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hasPreviousPage;
  188. }
  189. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> boolean isHasNextPage() {
  190. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hasNextPage;
  191. }
  192. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getNavigatePages() {
  193. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> navigatePages;
  194. }
  195. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;">[] getNavigatepageNums() {
  196. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> navigatepageNums;
  197. }
  198. @Override
  199. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String toString() {
  200. final StringBuffer sb </span>= <span style="color: #0000ff;">new</span> StringBuffer(<span style="color: #800000;">"</span><span style="color: #800000;">PageInfo{</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  201. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">pageNum=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(pageNum);
  202. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, pageSize=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(pageSize);
  203. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, size=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(size);
  204. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, startRow=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(startRow);
  205. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, endRow=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(endRow);
  206. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, total=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(total);
  207. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, pages=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(pages);
  208. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, list=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(list);
  209. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, firstPage=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(firstPage);
  210. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, prePage=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(prePage);
  211. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, nextPage=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(nextPage);
  212. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, lastPage=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(lastPage);
  213. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, isFirstPage=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(isFirstPage);
  214. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, isLastPage=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(isLastPage);
  215. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, hasPreviousPage=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(hasPreviousPage);
  216. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, hasNextPage=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(hasNextPage);
  217. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, navigatePages=</span><span style="color: #800000;">"</span><span style="color: #000000;">).append(navigatePages);
  218. sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, navigatepageNums=</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  219. </span><span style="color: #0000ff;">if</span> (navigatepageNums == <span style="color: #0000ff;">null</span>) sb.append(<span style="color: #800000;">"</span><span style="color: #800000;">null</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  220. </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
  221. sb.append(‘[‘);
  222. </span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < navigatepageNums.length; ++<span style="color: #000000;">i)
  223. sb.append(i </span>== <span style="color: #800080;">0</span> ? <span style="color: #800000;">""</span> : <span style="color: #800000;">"</span><span style="color: #800000;">, </span><span style="color: #800000;">"</span><span style="color: #000000;">).append(navigatepageNums[i]);
  224. sb.append(‘]‘);
  225. }
  226. sb.append(‘}‘);
  227. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sb.toString();
  228. }
  229. }</span>
PageInfo.java

因为PageInfo.java只是一个示例,所以他定义得有点重量级,属性有点多,我们可以参考它,定义适合我们自己的PageBean, 比如如下定义:

  1. <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> PageBean<T><span style="color: #000000;"> implements Serializable {
  2. </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> final <span style="color: #0000ff;">long</span> serialVersionUID = <span style="color: #800080;">8656597559014685635L</span><span style="color: #000000;">;
  3. </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">long</span> total; <span style="color: #008000;">//</span><span style="color: #008000;">总记录数</span>
  4. <span style="color: #0000ff;">private</span> List<T> list; <span style="color: #008000;">//</span><span style="color: #008000;">结果集</span>
  5. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> pageNum; <span style="color: #008000;">//</span><span style="color: #008000;"> 第几页</span>
  6. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> pageSize; <span style="color: #008000;">//</span><span style="color: #008000;"> 每页记录数</span>
  7. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> pages; <span style="color: #008000;">//</span><span style="color: #008000;"> 总页数</span>
  8. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> size; <span style="color: #008000;">//</span><span style="color: #008000;"> 当前页的数量 <= pageSize,该属性来自ArrayList的size属性</span>
  9. <span style="color: #008000;">/*</span><span style="color: #008000;">*
  10. * 包装Page对象,因为直接返回Page对象,在JSON处理以及其他情况下会被当成List来处理,
  11. * 而出现一些问题。
  12. * @param list page结果
  13. * @param navigatePages 页码数量
  14. </span><span style="color: #008000;">*/</span>
  15. <span style="color: #0000ff;">public</span> PageBean(List<T><span style="color: #000000;"> list) {
  16. </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (list instanceof Page) {
  17. Page</span><T> page = (Page<T><span style="color: #000000;">) list;
  18. </span><span style="color: #0000ff;">this</span>.pageNum =<span style="color: #000000;"> page.getPageNum();
  19. </span><span style="color: #0000ff;">this</span>.pageSize =<span style="color: #000000;"> page.getPageSize();
  20. </span><span style="color: #0000ff;">this</span>.total =<span style="color: #000000;"> page.getTotal();
  21. </span><span style="color: #0000ff;">this</span>.pages =<span style="color: #000000;"> page.getPages();
  22. </span><span style="color: #0000ff;">this</span>.list =<span style="color: #000000;"> page;
  23. </span><span style="color: #0000ff;">this</span>.size =<span style="color: #000000;"> page.size();
  24. }
  25. }
  26. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">long</span><span style="color: #000000;"> getTotal() {
  27. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> total;
  28. }
  29. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setTotal(<span style="color: #0000ff;">long</span><span style="color: #000000;"> total) {
  30. </span><span style="color: #0000ff;">this</span>.total =<span style="color: #000000;"> total;
  31. }
  32. </span><span style="color: #0000ff;">public</span> List<T><span style="color: #000000;"> getList() {
  33. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> list;
  34. }
  35. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setList(List<T><span style="color: #000000;"> list) {
  36. </span><span style="color: #0000ff;">this</span>.list =<span style="color: #000000;"> list;
  37. }
  38. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageNum() {
  39. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pageNum;
  40. }
  41. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setPageNum(<span style="color: #0000ff;">int</span><span style="color: #000000;"> pageNum) {
  42. </span><span style="color: #0000ff;">this</span>.pageNum =<span style="color: #000000;"> pageNum;
  43. }
  44. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageSize() {
  45. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pageSize;
  46. }
  47. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setPageSize(<span style="color: #0000ff;">int</span><span style="color: #000000;"> pageSize) {
  48. </span><span style="color: #0000ff;">this</span>.pageSize =<span style="color: #000000;"> pageSize;
  49. }
  50. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPages() {
  51. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pages;
  52. }
  53. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setPages(<span style="color: #0000ff;">int</span><span style="color: #000000;"> pages) {
  54. </span><span style="color: #0000ff;">this</span>.pages =<span style="color: #000000;"> pages;
  55. }
  56. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getSize() {
  57. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> size;
  58. }
  59. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setSize(<span style="color: #0000ff;">int</span><span style="color: #000000;"> size) {
  60. </span><span style="color: #0000ff;">this</span>.size =<span style="color: #000000;"> size;
  61. }
  62. }</span>
PageBean.java

因为分页查询结果返回的是一个 Page 对象,而 Page 对象继承自ArrayList,但是如果我们直接返回ArrayList的话,在一些场景下回遇到问题,比如在JSON处理Page类型的结果时,会被当成List来JSON格式化,会丢弃 Page 对象的所有扩展属性,所以这里我们要将分页的结果 Page 类型转换成我们自己定义的 PageBean. 我们自己定义的PageBean没有继承ArrayList,而是包含一个List属性来保存分页结果。所以避免前面的问题。

2)修改 serviceImpl中的代码:

  1. <span style="color: #000000;"> @Override
  2. </span><span style="color: #0000ff;">public</span> PageBean<User><span style="color: #000000;"> getUserByNoAndEmail(String no, String email) {
  3. Map</span><String, Object> map = <span style="color: #0000ff;">new</span> HashMap<><span style="color: #000000;">();
  4. map.put(</span><span style="color: #800000;">"</span><span style="color: #800000;">no</span><span style="color: #800000;">"</span><span style="color: #000000;">, no);
  5. map.put(</span><span style="color: #800000;">"</span><span style="color: #800000;">email</span><span style="color: #800000;">"</span><span style="color: #000000;">, email);
  6. PageHelper.startPage(PaginationContext.getPageNum(), PaginationContext.getPageSize());
  7. List</span><User> list = <span style="color: #0000ff;">this</span><span style="color: #000000;">.userMapper.getUserByNoAndEmail(map);
  8. </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> PageBean<User><span style="color: #000000;">(list);
  9. }</span>

我们只需要使用 PageHelper.startPage(pageNum, pageSize); 函数来指定 pageNum(第几页) 和 pageSize(每页显示几条记录) 两个参数。然后调用原来的查询,就进行了分页。最后将返回的List,转换成 PageBean类型的结果即可。前台页面就可以根据PageBean中包括的属性来进行分页显示了。

上面的 PaginationContext 是基于 ThreadLocal 来传递分页参数的一个工具类,其实现如下:

  1. <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> PaginationContext {
  2. </span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义两个threadLocal变量:pageNum和pageSize</span>
  3. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> ThreadLocal<Integer> pageNum = <span style="color: #0000ff;">new</span> ThreadLocal<Integer>(); <span style="color: #008000;">//</span><span style="color: #008000;"> 保存第几页</span>
  4. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> ThreadLocal<Integer> pageSize = <span style="color: #0000ff;">new</span> ThreadLocal<Integer>(); <span style="color: #008000;">//</span><span style="color: #008000;"> 保存每页记录条数</span>
  5. <span style="color: #008000;">/*</span><span style="color: #008000;">
  6. * pageNum :get、set、remove
  7. </span><span style="color: #008000;">*/</span>
  8. <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageNum() {
  9. Integer pn </span>= pageNum.<span style="color: #0000ff;">get</span><span style="color: #000000;">();
  10. </span><span style="color: #0000ff;">if</span> (pn == <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
  11. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  12. }
  13. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pn;
  14. }
  15. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> setPageNum(<span style="color: #0000ff;">int</span><span style="color: #000000;"> pageNumValue) {
  16. pageNum.</span><span style="color: #0000ff;">set</span><span style="color: #000000;">(pageNumValue);
  17. }
  18. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> removePageNum() {
  19. pageNum.remove();
  20. }
  21. </span><span style="color: #008000;">/*</span><span style="color: #008000;">
  22. * pageSize :get、set、remove
  23. </span><span style="color: #008000;">*/</span>
  24. <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageSize() {
  25. Integer ps </span>= pageSize.<span style="color: #0000ff;">get</span><span style="color: #000000;">();
  26. </span><span style="color: #0000ff;">if</span> (ps == <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
  27. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  28. }
  29. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> ps;
  30. }
  31. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> setPageSize(<span style="color: #0000ff;">int</span><span style="color: #000000;"> pageSizeValue) {
  32. pageSize.</span><span style="color: #0000ff;">set</span><span style="color: #000000;">(pageSizeValue);
  33. }
  34. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> removePageSize() {
  35. pageSize.remove();
  36. }
  37. }</span>
PaginationContext.java

实现了前台页面向ServiceImpl中传递分页参数: pageNum 和 pageSize.

OK,到此,PageHelper的使用方法,基本结束。

PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper

文档地址:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown

 

 

  1. @SuppressWarnings({"rawtypes", "unchecked"<span style="padding: 0px; color: #000000;">})
  2. </span><span style="padding: 0px; color: #0000ff;">public</span> <span style="padding: 0px; color: #0000ff;">class</span> PageInfo<T> <span style="padding: 0px; color: #0000ff;">implements</span><span style="padding: 0px; color: #000000;"> Serializable {
  3. </span><span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">static</span> <span style="padding: 0px; color: #0000ff;">final</span> <span style="padding: 0px; color: #0000ff;">long</span> serialVersionUID = 1L<span style="padding: 0px; color: #000000;">;
  4. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当前页</span>
  5. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> pageNum;
  6. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">每页的数量</span>
  7. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> pageSize;
  8. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当前页的数量</span>
  9. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> size;
  10. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">由于startRow和endRow不常用,这里说个具体的用法
  11. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">可以在页面中"显示startRow到endRow 共size条数据"
  12. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当前页面第一个元素在数据库中的行号</span>
  13. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> startRow;
  14. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当前页面最后一个元素在数据库中的行号</span>
  15. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> endRow;
  16. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">总记录数</span>
  17. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">long</span><span style="padding: 0px; color: #000000;"> total;
  18. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">总页数</span>
  19. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> pages;
  20. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">结果集</span>
  21. <span style="padding: 0px; color: #0000ff;">private</span> List<T><span style="padding: 0px; color: #000000;"> list;
  22. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">第一页</span>
  23. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> firstPage;
  24. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">前一页</span>
  25. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> prePage;
  26. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">下一页</span>
  27. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> nextPage;
  28. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">最后一页</span>
  29. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> lastPage;
  30. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">是否为第一页</span>
  31. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">boolean</span> isFirstPage = <span style="padding: 0px; color: #0000ff;">false</span><span style="padding: 0px; color: #000000;">;
  32. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">是否为最后一页</span>
  33. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">boolean</span> isLastPage = <span style="padding: 0px; color: #0000ff;">false</span><span style="padding: 0px; color: #000000;">;
  34. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">是否有前一页</span>
  35. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">boolean</span> hasPreviousPage = <span style="padding: 0px; color: #0000ff;">false</span><span style="padding: 0px; color: #000000;">;
  36. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">是否有下一页</span>
  37. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">boolean</span> hasNextPage = <span style="padding: 0px; color: #0000ff;">false</span><span style="padding: 0px; color: #000000;">;
  38. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">导航页码数</span>
  39. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> navigatePages;
  40. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">所有导航页号</span>
  41. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;">[] navigatepageNums;
  42. </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
  43. * 包装Page对象
  44. *
  45. * </span><span style="padding: 0px; color: #808080;">@param</span><span style="padding: 0px; color: #008000;"> list
  46. </span><span style="padding: 0px; color: #008000;">*/</span>
  47. <span style="padding: 0px; color: #0000ff;">public</span> PageInfo(List<T><span style="padding: 0px; color: #000000;"> list) {
  48. </span><span style="padding: 0px; color: #0000ff;">this</span>(list, 8<span style="padding: 0px; color: #000000;">);
  49. }
  50. </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
  51. * 包装Page对象
  52. *
  53. * </span><span style="padding: 0px; color: #808080;">@param</span><span style="padding: 0px; color: #008000;"> list page结果
  54. * </span><span style="padding: 0px; color: #808080;">@param</span><span style="padding: 0px; color: #008000;"> navigatePages 页码数量
  55. </span><span style="padding: 0px; color: #008000;">*/</span>
  56. <span style="padding: 0px; color: #0000ff;">public</span> PageInfo(List<T> list, <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> navigatePages) {
  57. </span><span style="padding: 0px; color: #0000ff;">if</span> (list <span style="padding: 0px; color: #0000ff;">instanceof</span><span style="padding: 0px; color: #000000;"> Page) {
  58. Page page </span>=<span style="padding: 0px; color: #000000;"> (Page) list;
  59. </span><span style="padding: 0px; color: #0000ff;">this</span>.pageNum =<span style="padding: 0px; color: #000000;"> page.getPageNum();
  60. </span><span style="padding: 0px; color: #0000ff;">this</span>.pageSize =<span style="padding: 0px; color: #000000;"> page.getPageSize();
  61. </span><span style="padding: 0px; color: #0000ff;">this</span>.total =<span style="padding: 0px; color: #000000;"> page.getTotal();
  62. </span><span style="padding: 0px; color: #0000ff;">this</span>.pages =<span style="padding: 0px; color: #000000;"> page.getPages();
  63. </span><span style="padding: 0px; color: #0000ff;">this</span>.list =<span style="padding: 0px; color: #000000;"> page;
  64. </span><span style="padding: 0px; color: #0000ff;">this</span>.size =<span style="padding: 0px; color: #000000;"> page.size();
  65. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">由于结果是>startRow的,所以实际的需要+1</span>
  66. <span style="padding: 0px; color: #0000ff;">if</span> (<span style="padding: 0px; color: #0000ff;">this</span>.size == 0<span style="padding: 0px; color: #000000;">) {
  67. </span><span style="padding: 0px; color: #0000ff;">this</span>.startRow = 0<span style="padding: 0px; color: #000000;">;
  68. </span><span style="padding: 0px; color: #0000ff;">this</span>.endRow = 0<span style="padding: 0px; color: #000000;">;
  69. } </span><span style="padding: 0px; color: #0000ff;">else</span><span style="padding: 0px; color: #000000;"> {
  70. </span><span style="padding: 0px; color: #0000ff;">this</span>.startRow = page.getStartRow() + 1<span style="padding: 0px; color: #000000;">;
  71. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">计算实际的endRow(最后一页的时候特殊)</span>
  72. <span style="padding: 0px; color: #0000ff;">this</span>.endRow = <span style="padding: 0px; color: #0000ff;">this</span>.startRow - 1 + <span style="padding: 0px; color: #0000ff;">this</span><span style="padding: 0px; color: #000000;">.size;
  73. }
  74. </span><span style="padding: 0px; color: #0000ff;">this</span>.navigatePages =<span style="padding: 0px; color: #000000;"> navigatePages;
  75. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">计算导航页</span>
  76. <span style="padding: 0px; color: #000000;"> calcNavigatepageNums();
  77. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">计算前后页,第一页,最后一页</span>
  78. <span style="padding: 0px; color: #000000;"> calcPage();
  79. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">判断页面边界</span>
  80. <span style="padding: 0px; color: #000000;"> judgePageBoudary();
  81. }
  82. }
  83. </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
  84. * 计算导航页
  85. </span><span style="padding: 0px; color: #008000;">*/</span>
  86. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">void</span><span style="padding: 0px; color: #000000;"> calcNavigatepageNums() {
  87. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当总页数小于或等于导航页码数时</span>
  88. <span style="padding: 0px; color: #0000ff;">if</span> (pages <=<span style="padding: 0px; color: #000000;"> navigatePages) {
  89. navigatepageNums </span>= <span style="padding: 0px; color: #0000ff;">new</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;">[pages];
  90. </span><span style="padding: 0px; color: #0000ff;">for</span> (<span style="padding: 0px; color: #0000ff;">int</span> i = 0; i < pages; i++<span style="padding: 0px; color: #000000;">) {
  91. navigatepageNums[i] </span>= i + 1<span style="padding: 0px; color: #000000;">;
  92. }
  93. } </span><span style="padding: 0px; color: #0000ff;">else</span> { <span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当总页数大于导航页码数时</span>
  94. navigatepageNums = <span style="padding: 0px; color: #0000ff;">new</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;">[navigatePages];
  95. </span><span style="padding: 0px; color: #0000ff;">int</span> startNum = pageNum - navigatePages / 2<span style="padding: 0px; color: #000000;">;
  96. </span><span style="padding: 0px; color: #0000ff;">int</span> endNum = pageNum + navigatePages / 2<span style="padding: 0px; color: #000000;">;
  97. </span><span style="padding: 0px; color: #0000ff;">if</span> (startNum < 1<span style="padding: 0px; color: #000000;">) {
  98. startNum </span>= 1<span style="padding: 0px; color: #000000;">;
  99. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">(最前navigatePages页</span>
  100. <span style="padding: 0px; color: #0000ff;">for</span> (<span style="padding: 0px; color: #0000ff;">int</span> i = 0; i < navigatePages; i++<span style="padding: 0px; color: #000000;">) {
  101. navigatepageNums[i] </span>= startNum++<span style="padding: 0px; color: #000000;">;
  102. }
  103. } </span><span style="padding: 0px; color: #0000ff;">else</span> <span style="padding: 0px; color: #0000ff;">if</span> (endNum ><span style="padding: 0px; color: #000000;"> pages) {
  104. endNum </span>=<span style="padding: 0px; color: #000000;"> pages;
  105. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">最后navigatePages页</span>
  106. <span style="padding: 0px; color: #0000ff;">for</span> (<span style="padding: 0px; color: #0000ff;">int</span> i = navigatePages - 1; i >= 0; i--<span style="padding: 0px; color: #000000;">) {
  107. navigatepageNums[i] </span>= endNum--<span style="padding: 0px; color: #000000;">;
  108. }
  109. } </span><span style="padding: 0px; color: #0000ff;">else</span><span style="padding: 0px; color: #000000;"> {
  110. </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">所有中间页</span>
  111. <span style="padding: 0px; color: #0000ff;">for</span> (<span style="padding: 0px; color: #0000ff;">int</span> i = 0; i < navigatePages; i++<span style="padding: 0px; color: #000000;">) {
  112. navigatepageNums[i] </span>= startNum++<span style="padding: 0px; color: #000000;">;
  113. }
  114. }
  115. }
  116. }
  117. </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
  118. * 计算前后页,第一页,最后一页
  119. </span><span style="padding: 0px; color: #008000;">*/</span>
  120. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">void</span><span style="padding: 0px; color: #000000;"> calcPage() {
  121. </span><span style="padding: 0px; color: #0000ff;">if</span> (navigatepageNums != <span style="padding: 0px; color: #0000ff;">null</span> && navigatepageNums.length > 0<span style="padding: 0px; color: #000000;">) {
  122. firstPage </span>= navigatepageNums[0<span style="padding: 0px; color: #000000;">];
  123. lastPage </span>= navigatepageNums[navigatepageNums.length - 1<span style="padding: 0px; color: #000000;">];
  124. </span><span style="padding: 0px; color: #0000ff;">if</span> (pageNum > 1<span style="padding: 0px; color: #000000;">) {
  125. prePage </span>= pageNum - 1<span style="padding: 0px; color: #000000;">;
  126. }
  127. </span><span style="padding: 0px; color: #0000ff;">if</span> (pageNum <<span style="padding: 0px; color: #000000;"> pages) {
  128. nextPage </span>= pageNum + 1<span style="padding: 0px; color: #000000;">;
  129. }
  130. }
  131. }
  132. </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
  133. * 判定页面边界
  134. </span><span style="padding: 0px; color: #008000;">*/</span>
  135. <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">void</span><span style="padding: 0px; color: #000000;"> judgePageBoudary() {
  136. isFirstPage </span>= pageNum == 1<span style="padding: 0px; color: #000000;">;
  137. isLastPage </span>= pageNum ==<span style="padding: 0px; color: #000000;"> pages;
  138. hasPreviousPage </span>= pageNum > 1<span style="padding: 0px; color: #000000;">;
  139. hasNextPage </span>= pageNum <<span style="padding: 0px; color: #000000;"> pages;
  140. }
  141. </span><span style="padding: 0px; color: #0000ff;">public</span> <span style="padding: 0px; color: #0000ff;">void</span> setPageNum(<span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> pageNum) {
  142. </span><span style="padding: 0px; color: #0000ff;">this</span>.pageNum =<span style="padding: 0px; color: #000000;"> pageNum;
  143. }
  144. </span><span style="padding: 0px; color: #0000ff;">public</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> getPageNum() {
  145. </span><span style="padding: 0px; color: #0000ff;">return</span><span style="padding: 0px; color: #000000;"> pageNum;
  146. }
  147. </span><span style="padding: 0px; color: #0000ff; </div>
  148. <div class=" "="">
  149. <ul class="m-news-opt fix">
  150. <li class="opt-item">
  151. <a href="/sql_question-449027.html" target="_blank"><p>< 上一篇</p><p class="ellipsis">oracle 10g学习2</p></a>
  152. </li>
  153. <li class="opt-item ta-r">
  154. <a href="/sql_question-449029.html" target="_blank"><p>下一篇 ></p><p class="ellipsis">关于mysql获取第N个数据</p></a>
  155. </li>
  156. </ul>
  157. </span>

人气教程排行