时间:2021-07-01 10:21:17 帮助过:4人阅读
2. 配置分页拦截器
PageHelper的原理是基于拦截器实现的。拦截器的配置有两种方法,一种是在mybatis的配置文件中配置,一种是直接在spring的配置文件中进行:
1)在mybatis-config.xml文件中配置:
- <plugins>
- <!-- com.github.pagehelper为PageHelper类所在包名 -->
- <plugin interceptor=<span style="color: #800000;">"</span><span style="color: #800000;">com.github.pagehelper.PageHelper</span><span style="color: #800000;">"</span>>
- <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>/>
- <!-- 该参数默认为false -->
- <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
- <!-- 和startPage中的pageNum效果一样-->
- <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>/>
- <!-- 该参数默认为false -->
- <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
- <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>/>
- <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
- <!--<span style="color: #000000;"> (相当于没有执行分页查询,但是返回结果仍然是Page类型)
- </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>/>-->
- <!-- <span style="color: #800080;">3.3</span>.0版本可用 - 分页参数合理化,默认false禁用 -->
- <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
- <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
- <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>/>
- <!-- <span style="color: #800080;">3.5</span>.0版本可用 - 为了支持startPage(Object <span style="color: #0000ff;">params</span>)方法 -->
- <!-- 增加了一个`<span style="color: #0000ff;">params</span>`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
- <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
- <!--<span style="color: #000000;"> 不理解该含义的前提下,不要随便复制该配置
- </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>/> -->
- </plugin>
- </plugins>
这里要注意 <plugins> 在mybatis-config.xml文件中的位置,必须要符合 http://mybatis.org/dtd/mybatis-3-config.dtd 中指定的顺序:
- <!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?<span style="color: #000000;">,
- objectFactory</span>?, objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
不然会报错。
当然mybatis-config.xml的位置,我们需要在spring的配置文件中进行指定:
- <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>>
- <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> />
- <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> />
- <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> />
- </bean>
2)如果mybatis没有mybatis-config.xml文件,那么就只能直接在spring的配置文件中配置了:
- <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>>
- <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>/>
- <property name=<span style="color: #800000;">"</span><span style="color: #800000;">mapperLocations</span><span style="color: #800000;">"</span>>
- <array>
- <value>classpath:config/mapper<span style="color: #008000;">/*</span><span style="color: #008000;">.xml</value>
- </array>
- </property>
- <property name="typeAliasesPackage" value="com.test.pojo"/>
- <property name="plugins">
- <array>
- <bean class="com.github.pagehelper.PageHelper">
- <property name="properties">
- <value>
- dialect=mysql
- </value>
- </property>
- </bean>
- </array>
- </property>
- </bean></span>
到这里PageHelper所需要的配置已经完成,下面还需要在serviceImpl类中加入分页参数的代码:
3. 向拦截器传递分页参数
我们首先看下不分页的serviceImpl代码:
- <span style="color: #000000;">@Override
- </span><span style="color: #0000ff;">public</span> List<User><span style="color: #000000;"> getUserByNoAndEmail(String no, String email) {
- Map</span><String, Object> map = <span style="color: #0000ff;">new</span> HashMap<><span style="color: #000000;">();
- map.put(</span><span style="color: #800000;">"</span><span style="color: #800000;">no</span><span style="color: #800000;">"</span><span style="color: #000000;">, no);
- map.put(</span><span style="color: #800000;">"</span><span style="color: #800000;">email</span><span style="color: #800000;">"</span><span style="color: #000000;">, email);
- </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span><span style="color: #000000;">.userMapper.getUserByNoAndEmail(map);
- }</span>
然后我们将它改造成使用PageHelper分页:
1)首先我们根据自己项目的情况,定义一个PageBean,来保存分页之后的结果,需要哪些属性,就加入哪些属性,具体可以参考源代码中的PageInfo类的定义,其实PageInfo是插件作者给我们自己定义自己的PageBean,提供的一个参考例子。PageInfo代码如下:
PageInfo.java
- @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;">})
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> PageInfo<T><span style="color: #000000;"> implements Serializable {
- </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;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">当前页</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> pageNum;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">每页的数量</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> pageSize;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">当前页的数量</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> size;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">由于startRow和endRow不常用,这里说个具体的用法
- </span><span style="color: #008000;">//</span><span style="color: #008000;">可以在页面中"显示startRow到endRow 共size条数据"
- </span><span style="color: #008000;">//</span><span style="color: #008000;">当前页面第一个元素在数据库中的行号</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> startRow;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">当前页面最后一个元素在数据库中的行号</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> endRow;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">总记录数</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">long</span><span style="color: #000000;"> total;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">总页数</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> pages;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">结果集</span>
- <span style="color: #0000ff;">private</span> List<T><span style="color: #000000;"> list;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">第一页</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> firstPage;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">前一页</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> prePage;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">下一页</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> nextPage;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">最后一页</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> lastPage;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">是否为第一页</span>
- <span style="color: #0000ff;">private</span> boolean isFirstPage = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">是否为最后一页</span>
- <span style="color: #0000ff;">private</span> boolean isLastPage = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">是否有前一页</span>
- <span style="color: #0000ff;">private</span> boolean hasPreviousPage = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">是否有下一页</span>
- <span style="color: #0000ff;">private</span> boolean hasNextPage = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">导航页码数</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> navigatePages;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">所有导航页号</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;">[] navigatepageNums;
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
- * 包装Page对象
- *
- * @param list
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> PageInfo(List<T><span style="color: #000000;"> list) {
- </span><span style="color: #0000ff;">this</span>(list, <span style="color: #800080;">8</span><span style="color: #000000;">);
- }
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
- * 包装Page对象
- *
- * @param list page结果
- * @param navigatePages 页码数量
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> PageInfo(List<T> list, <span style="color: #0000ff;">int</span><span style="color: #000000;"> navigatePages) {
- </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (list instanceof Page) {
- Page page </span>=<span style="color: #000000;"> (Page) list;
- </span><span style="color: #0000ff;">this</span>.pageNum =<span style="color: #000000;"> page.getPageNum();
- </span><span style="color: #0000ff;">this</span>.pageSize =<span style="color: #000000;"> page.getPageSize();
- </span><span style="color: #0000ff;">this</span>.total =<span style="color: #000000;"> page.getTotal();
- </span><span style="color: #0000ff;">this</span>.pages =<span style="color: #000000;"> page.getPages();
- </span><span style="color: #0000ff;">this</span>.list =<span style="color: #000000;"> page;
- </span><span style="color: #0000ff;">this</span>.size =<span style="color: #000000;"> page.size();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">由于结果是>startRow的,所以实际的需要+1</span>
- <span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">this</span>.size == <span style="color: #800080;">0</span><span style="color: #000000;">) {
- </span><span style="color: #0000ff;">this</span>.startRow = <span style="color: #800080;">0</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">this</span>.endRow = <span style="color: #800080;">0</span><span style="color: #000000;">;
- } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
- </span><span style="color: #0000ff;">this</span>.startRow = page.getStartRow() + <span style="color: #800080;">1</span><span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">计算实际的endRow(最后一页的时候特殊)</span>
- <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;
- }
- </span><span style="color: #0000ff;">this</span>.navigatePages =<span style="color: #000000;"> navigatePages;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">计算导航页</span>
- <span style="color: #000000;"> calcNavigatepageNums();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">计算前后页,第一页,最后一页</span>
- <span style="color: #000000;"> calcPage();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">判断页面边界</span>
- <span style="color: #000000;"> judgePageBoudary();
- }
- }
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
- * 计算导航页
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> calcNavigatepageNums() {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">当总页数小于或等于导航页码数时</span>
- <span style="color: #0000ff;">if</span> (pages <=<span style="color: #000000;"> navigatePages) {
- navigatepageNums </span>= <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">int</span><span style="color: #000000;">[pages];
- </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;">) {
- navigatepageNums[i] </span>= i + <span style="color: #800080;">1</span><span style="color: #000000;">;
- }
- } </span><span style="color: #0000ff;">else</span> { <span style="color: #008000;">//</span><span style="color: #008000;">当总页数大于导航页码数时</span>
- navigatepageNums = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">int</span><span style="color: #000000;">[navigatePages];
- </span><span style="color: #0000ff;">int</span> startNum = pageNum - navigatePages / <span style="color: #800080;">2</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">int</span> endNum = pageNum + navigatePages / <span style="color: #800080;">2</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">if</span> (startNum < <span style="color: #800080;">1</span><span style="color: #000000;">) {
- startNum </span>= <span style="color: #800080;">1</span><span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">(最前navigatePages页</span>
- <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;">) {
- navigatepageNums[i] </span>= startNum++<span style="color: #000000;">;
- }
- } </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (endNum ><span style="color: #000000;"> pages) {
- endNum </span>=<span style="color: #000000;"> pages;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">最后navigatePages页</span>
- <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;">) {
- navigatepageNums[i] </span>= endNum--<span style="color: #000000;">;
- }
- } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">所有中间页</span>
- <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;">) {
- navigatepageNums[i] </span>= startNum++<span style="color: #000000;">;
- }
- }
- }
- }
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
- * 计算前后页,第一页,最后一页
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> calcPage() {
- </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;">) {
- firstPage </span>= navigatepageNums[<span style="color: #800080;">0</span><span style="color: #000000;">];
- lastPage </span>= navigatepageNums[navigatepageNums.length - <span style="color: #800080;">1</span><span style="color: #000000;">];
- </span><span style="color: #0000ff;">if</span> (pageNum > <span style="color: #800080;">1</span><span style="color: #000000;">) {
- prePage </span>= pageNum - <span style="color: #800080;">1</span><span style="color: #000000;">;
- }
- </span><span style="color: #0000ff;">if</span> (pageNum <<span style="color: #000000;"> pages) {
- nextPage </span>= pageNum + <span style="color: #800080;">1</span><span style="color: #000000;">;
- }
- }
- }
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
- * 判定页面边界
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> judgePageBoudary() {
- isFirstPage </span>= pageNum == <span style="color: #800080;">1</span><span style="color: #000000;">;
- isLastPage </span>= pageNum ==<span style="color: #000000;"> pages;
- hasPreviousPage </span>= pageNum > <span style="color: #800080;">1</span><span style="color: #000000;">;
- hasNextPage </span>= pageNum <<span style="color: #000000;"> pages;
- }
- </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) {
- </span><span style="color: #0000ff;">this</span>.pageNum =<span style="color: #000000;"> pageNum;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageNum() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pageNum;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageSize() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pageSize;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getSize() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> size;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getStartRow() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> startRow;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getEndRow() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> endRow;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">long</span><span style="color: #000000;"> getTotal() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> total;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPages() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pages;
- }
- </span><span style="color: #0000ff;">public</span> List<T><span style="color: #000000;"> getList() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> list;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getFirstPage() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> firstPage;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPrePage() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> prePage;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getNextPage() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> nextPage;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getLastPage() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> lastPage;
- }
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> boolean isIsFirstPage() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> isFirstPage;
- }
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> boolean isIsLastPage() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> isLastPage;
- }
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> boolean isHasPreviousPage() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hasPreviousPage;
- }
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> boolean isHasNextPage() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hasNextPage;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getNavigatePages() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> navigatePages;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;">[] getNavigatepageNums() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> navigatepageNums;
- }
- @Override
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String toString() {
- 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;">);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- sb.append(</span><span style="color: #800000;">"</span><span style="color: #800000;">, navigatepageNums=</span><span style="color: #800000;">"</span><span style="color: #000000;">);
- </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;">);
- </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
- sb.append(‘[‘);
- </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)
- 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]);
- sb.append(‘]‘);
- }
- sb.append(‘}‘);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sb.toString();
- }
- }</span>
因为PageInfo.java只是一个示例,所以他定义得有点重量级,属性有点多,我们可以参考它,定义适合我们自己的PageBean, 比如如下定义:
PageBean.java
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> PageBean<T><span style="color: #000000;"> implements Serializable {
- </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;">;
- </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">long</span> total; <span style="color: #008000;">//</span><span style="color: #008000;">总记录数</span>
- <span style="color: #0000ff;">private</span> List<T> list; <span style="color: #008000;">//</span><span style="color: #008000;">结果集</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> pageNum; <span style="color: #008000;">//</span><span style="color: #008000;"> 第几页</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> pageSize; <span style="color: #008000;">//</span><span style="color: #008000;"> 每页记录数</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> pages; <span style="color: #008000;">//</span><span style="color: #008000;"> 总页数</span>
- <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>
- <span style="color: #008000;">/*</span><span style="color: #008000;">*
- * 包装Page对象,因为直接返回Page对象,在JSON处理以及其他情况下会被当成List来处理,
- * 而出现一些问题。
- * @param list page结果
- * @param navigatePages 页码数量
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> PageBean(List<T><span style="color: #000000;"> list) {
- </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (list instanceof Page) {
- Page</span><T> page = (Page<T><span style="color: #000000;">) list;
- </span><span style="color: #0000ff;">this</span>.pageNum =<span style="color: #000000;"> page.getPageNum();
- </span><span style="color: #0000ff;">this</span>.pageSize =<span style="color: #000000;"> page.getPageSize();
- </span><span style="color: #0000ff;">this</span>.total =<span style="color: #000000;"> page.getTotal();
- </span><span style="color: #0000ff;">this</span>.pages =<span style="color: #000000;"> page.getPages();
- </span><span style="color: #0000ff;">this</span>.list =<span style="color: #000000;"> page;
- </span><span style="color: #0000ff;">this</span>.size =<span style="color: #000000;"> page.size();
- }
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">long</span><span style="color: #000000;"> getTotal() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> total;
- }
- </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) {
- </span><span style="color: #0000ff;">this</span>.total =<span style="color: #000000;"> total;
- }
- </span><span style="color: #0000ff;">public</span> List<T><span style="color: #000000;"> getList() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> list;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setList(List<T><span style="color: #000000;"> list) {
- </span><span style="color: #0000ff;">this</span>.list =<span style="color: #000000;"> list;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageNum() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pageNum;
- }
- </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) {
- </span><span style="color: #0000ff;">this</span>.pageNum =<span style="color: #000000;"> pageNum;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageSize() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pageSize;
- }
- </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) {
- </span><span style="color: #0000ff;">this</span>.pageSize =<span style="color: #000000;"> pageSize;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPages() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pages;
- }
- </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) {
- </span><span style="color: #0000ff;">this</span>.pages =<span style="color: #000000;"> pages;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getSize() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> size;
- }
- </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) {
- </span><span style="color: #0000ff;">this</span>.size =<span style="color: #000000;"> size;
- }
- }</span>
因为分页查询结果返回的是一个 Page 对象,而 Page 对象继承自ArrayList,但是如果我们直接返回ArrayList的话,在一些场景下回遇到问题,比如在JSON处理Page类型的结果时,会被当成List来JSON格式化,会丢弃 Page 对象的所有扩展属性,所以这里我们要将分页的结果 Page 类型转换成我们自己定义的 PageBean. 我们自己定义的PageBean没有继承ArrayList,而是包含一个List属性来保存分页结果。所以避免前面的问题。
2)修改 serviceImpl中的代码:
- <span style="color: #000000;"> @Override
- </span><span style="color: #0000ff;">public</span> PageBean<User><span style="color: #000000;"> getUserByNoAndEmail(String no, String email) {
- Map</span><String, Object> map = <span style="color: #0000ff;">new</span> HashMap<><span style="color: #000000;">();
- map.put(</span><span style="color: #800000;">"</span><span style="color: #800000;">no</span><span style="color: #800000;">"</span><span style="color: #000000;">, no);
- map.put(</span><span style="color: #800000;">"</span><span style="color: #800000;">email</span><span style="color: #800000;">"</span><span style="color: #000000;">, email);
- PageHelper.startPage(PaginationContext.getPageNum(), PaginationContext.getPageSize());
- List</span><User> list = <span style="color: #0000ff;">this</span><span style="color: #000000;">.userMapper.getUserByNoAndEmail(map);
- </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> PageBean<User><span style="color: #000000;">(list);
- }</span>
我们只需要使用 PageHelper.startPage(pageNum, pageSize); 函数来指定 pageNum(第几页) 和 pageSize(每页显示几条记录) 两个参数。然后调用原来的查询,就进行了分页。最后将返回的List,转换成 PageBean类型的结果即可。前台页面就可以根据PageBean中包括的属性来进行分页显示了。
上面的 PaginationContext 是基于 ThreadLocal 来传递分页参数的一个工具类,其实现如下:
PaginationContext.java
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> PaginationContext {
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义两个threadLocal变量:pageNum和pageSize</span>
- <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>
- <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>
- <span style="color: #008000;">/*</span><span style="color: #008000;">
- * pageNum :get、set、remove
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageNum() {
- Integer pn </span>= pageNum.<span style="color: #0000ff;">get</span><span style="color: #000000;">();
- </span><span style="color: #0000ff;">if</span> (pn == <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- }
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pn;
- }
- </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) {
- pageNum.</span><span style="color: #0000ff;">set</span><span style="color: #000000;">(pageNumValue);
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> removePageNum() {
- pageNum.remove();
- }
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">
- * pageSize :get、set、remove
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getPageSize() {
- Integer ps </span>= pageSize.<span style="color: #0000ff;">get</span><span style="color: #000000;">();
- </span><span style="color: #0000ff;">if</span> (ps == <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- }
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> ps;
- }
- </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) {
- pageSize.</span><span style="color: #0000ff;">set</span><span style="color: #000000;">(pageSizeValue);
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> removePageSize() {
- pageSize.remove();
- }
- }</span>
实现了前台页面向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
- @SuppressWarnings({"rawtypes", "unchecked"<span style="padding: 0px; color: #000000;">})
- </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 {
- </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;">;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当前页</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> pageNum;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">每页的数量</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> pageSize;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当前页的数量</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> size;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">由于startRow和endRow不常用,这里说个具体的用法
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">可以在页面中"显示startRow到endRow 共size条数据"
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当前页面第一个元素在数据库中的行号</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> startRow;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当前页面最后一个元素在数据库中的行号</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> endRow;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">总记录数</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">long</span><span style="padding: 0px; color: #000000;"> total;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">总页数</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> pages;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">结果集</span>
- <span style="padding: 0px; color: #0000ff;">private</span> List<T><span style="padding: 0px; color: #000000;"> list;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">第一页</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> firstPage;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">前一页</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> prePage;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">下一页</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> nextPage;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">最后一页</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> lastPage;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">是否为第一页</span>
- <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;">;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">是否为最后一页</span>
- <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;">;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">是否有前一页</span>
- <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;">;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">是否有下一页</span>
- <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;">;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">导航页码数</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> navigatePages;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">所有导航页号</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;">[] navigatepageNums;
- </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
- * 包装Page对象
- *
- * </span><span style="padding: 0px; color: #808080;">@param</span><span style="padding: 0px; color: #008000;"> list
- </span><span style="padding: 0px; color: #008000;">*/</span>
- <span style="padding: 0px; color: #0000ff;">public</span> PageInfo(List<T><span style="padding: 0px; color: #000000;"> list) {
- </span><span style="padding: 0px; color: #0000ff;">this</span>(list, 8<span style="padding: 0px; color: #000000;">);
- }
- </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
- * 包装Page对象
- *
- * </span><span style="padding: 0px; color: #808080;">@param</span><span style="padding: 0px; color: #008000;"> list page结果
- * </span><span style="padding: 0px; color: #808080;">@param</span><span style="padding: 0px; color: #008000;"> navigatePages 页码数量
- </span><span style="padding: 0px; color: #008000;">*/</span>
- <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) {
- </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) {
- Page page </span>=<span style="padding: 0px; color: #000000;"> (Page) list;
- </span><span style="padding: 0px; color: #0000ff;">this</span>.pageNum =<span style="padding: 0px; color: #000000;"> page.getPageNum();
- </span><span style="padding: 0px; color: #0000ff;">this</span>.pageSize =<span style="padding: 0px; color: #000000;"> page.getPageSize();
- </span><span style="padding: 0px; color: #0000ff;">this</span>.total =<span style="padding: 0px; color: #000000;"> page.getTotal();
- </span><span style="padding: 0px; color: #0000ff;">this</span>.pages =<span style="padding: 0px; color: #000000;"> page.getPages();
- </span><span style="padding: 0px; color: #0000ff;">this</span>.list =<span style="padding: 0px; color: #000000;"> page;
- </span><span style="padding: 0px; color: #0000ff;">this</span>.size =<span style="padding: 0px; color: #000000;"> page.size();
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">由于结果是>startRow的,所以实际的需要+1</span>
- <span style="padding: 0px; color: #0000ff;">if</span> (<span style="padding: 0px; color: #0000ff;">this</span>.size == 0<span style="padding: 0px; color: #000000;">) {
- </span><span style="padding: 0px; color: #0000ff;">this</span>.startRow = 0<span style="padding: 0px; color: #000000;">;
- </span><span style="padding: 0px; color: #0000ff;">this</span>.endRow = 0<span style="padding: 0px; color: #000000;">;
- } </span><span style="padding: 0px; color: #0000ff;">else</span><span style="padding: 0px; color: #000000;"> {
- </span><span style="padding: 0px; color: #0000ff;">this</span>.startRow = page.getStartRow() + 1<span style="padding: 0px; color: #000000;">;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">计算实际的endRow(最后一页的时候特殊)</span>
- <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;
- }
- </span><span style="padding: 0px; color: #0000ff;">this</span>.navigatePages =<span style="padding: 0px; color: #000000;"> navigatePages;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">计算导航页</span>
- <span style="padding: 0px; color: #000000;"> calcNavigatepageNums();
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">计算前后页,第一页,最后一页</span>
- <span style="padding: 0px; color: #000000;"> calcPage();
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">判断页面边界</span>
- <span style="padding: 0px; color: #000000;"> judgePageBoudary();
- }
- }
- </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
- * 计算导航页
- </span><span style="padding: 0px; color: #008000;">*/</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">void</span><span style="padding: 0px; color: #000000;"> calcNavigatepageNums() {
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当总页数小于或等于导航页码数时</span>
- <span style="padding: 0px; color: #0000ff;">if</span> (pages <=<span style="padding: 0px; color: #000000;"> navigatePages) {
- 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];
- </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;">) {
- navigatepageNums[i] </span>= i + 1<span style="padding: 0px; color: #000000;">;
- }
- } </span><span style="padding: 0px; color: #0000ff;">else</span> { <span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">当总页数大于导航页码数时</span>
- navigatepageNums = <span style="padding: 0px; color: #0000ff;">new</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;">[navigatePages];
- </span><span style="padding: 0px; color: #0000ff;">int</span> startNum = pageNum - navigatePages / 2<span style="padding: 0px; color: #000000;">;
- </span><span style="padding: 0px; color: #0000ff;">int</span> endNum = pageNum + navigatePages / 2<span style="padding: 0px; color: #000000;">;
- </span><span style="padding: 0px; color: #0000ff;">if</span> (startNum < 1<span style="padding: 0px; color: #000000;">) {
- startNum </span>= 1<span style="padding: 0px; color: #000000;">;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">(最前navigatePages页</span>
- <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;">) {
- navigatepageNums[i] </span>= startNum++<span style="padding: 0px; color: #000000;">;
- }
- } </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) {
- endNum </span>=<span style="padding: 0px; color: #000000;"> pages;
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">最后navigatePages页</span>
- <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;">) {
- navigatepageNums[i] </span>= endNum--<span style="padding: 0px; color: #000000;">;
- }
- } </span><span style="padding: 0px; color: #0000ff;">else</span><span style="padding: 0px; color: #000000;"> {
- </span><span style="padding: 0px; color: #008000;">//</span><span style="padding: 0px; color: #008000;">所有中间页</span>
- <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;">) {
- navigatepageNums[i] </span>= startNum++<span style="padding: 0px; color: #000000;">;
- }
- }
- }
- }
- </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
- * 计算前后页,第一页,最后一页
- </span><span style="padding: 0px; color: #008000;">*/</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">void</span><span style="padding: 0px; color: #000000;"> calcPage() {
- </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;">) {
- firstPage </span>= navigatepageNums[0<span style="padding: 0px; color: #000000;">];
- lastPage </span>= navigatepageNums[navigatepageNums.length - 1<span style="padding: 0px; color: #000000;">];
- </span><span style="padding: 0px; color: #0000ff;">if</span> (pageNum > 1<span style="padding: 0px; color: #000000;">) {
- prePage </span>= pageNum - 1<span style="padding: 0px; color: #000000;">;
- }
- </span><span style="padding: 0px; color: #0000ff;">if</span> (pageNum <<span style="padding: 0px; color: #000000;"> pages) {
- nextPage </span>= pageNum + 1<span style="padding: 0px; color: #000000;">;
- }
- }
- }
- </span><span style="padding: 0px; color: #008000;">/**</span><span style="padding: 0px; color: #008000;">
- * 判定页面边界
- </span><span style="padding: 0px; color: #008000;">*/</span>
- <span style="padding: 0px; color: #0000ff;">private</span> <span style="padding: 0px; color: #0000ff;">void</span><span style="padding: 0px; color: #000000;"> judgePageBoudary() {
- isFirstPage </span>= pageNum == 1<span style="padding: 0px; color: #000000;">;
- isLastPage </span>= pageNum ==<span style="padding: 0px; color: #000000;"> pages;
- hasPreviousPage </span>= pageNum > 1<span style="padding: 0px; color: #000000;">;
- hasNextPage </span>= pageNum <<span style="padding: 0px; color: #000000;"> pages;
- }
- </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) {
- </span><span style="padding: 0px; color: #0000ff;">this</span>.pageNum =<span style="padding: 0px; color: #000000;"> pageNum;
- }
- </span><span style="padding: 0px; color: #0000ff;">public</span> <span style="padding: 0px; color: #0000ff;">int</span><span style="padding: 0px; color: #000000;"> getPageNum() {
- </span><span style="padding: 0px; color: #0000ff;">return</span><span style="padding: 0px; color: #000000;"> pageNum;
- }
- </span><span style="padding: 0px; color: #0000ff; </div>
- <div class=" "="">
- <ul class="m-news-opt fix">
- <li class="opt-item">
- <a href="/sql_question-449027.html" target="_blank"><p>< 上一篇</p><p class="ellipsis">oracle 10g学习2</p></a>
- </li>
- <li class="opt-item ta-r">
- <a href="/sql_question-449029.html" target="_blank"><p>下一篇 ></p><p class="ellipsis">关于mysql获取第N个数据</p></a>
- </li>
- </ul>
- </span>