mybatis分页插件pagehelper
如果你也在用 mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页。
pagehelper是一个mybatis的分页插件, 负责将已经写好的sql语句, 进行分页加工.
pagehelper的使用
优点:无需你自己去封装以及关心sql分页等问题,使用很方便,前端取数据也很方便。
1.引入pagehelper依赖
1
2
3
4
5
|
<dependency>
<groupid>com.github.pagehelper</groupid>
<artifactid>pagehelper</artifactid>
<version> 5.1 . 2 <ersion>
</dependency>
|
2.配置applicationcontext.xml文件
在spring的sqlsessionfactory
的bean
中增加一个分页拦截器属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<bean id= "sqlsessionfactory" class = "org.mybatis.spring.sqlsessionfactorybean" >
<property name= "plugins" >
<array>
<bean class = "com.github.pagehelper.pageinterceptor" >
<property name= "properties" >
<value>
<!-- 这里设定你的数据库类型 -->
helperdialect=mysql
</value>
</property>
</bean>
</array>
</property>
</bean>
|
3.调用pagehelper的方法
在service方法中调用pagehelper的静态方法startpage
(注意一定要在实际查询数据库之前调用该方法),传入需要查询的页号和每页大小,返回pagehelper插件提供的pageinfo对象。即可自动完成数据库物理分页,无须在你的sql语句中手工加limit
子句
4. pageinfo的结构
关于pageinfo的结构请参看源码,这里通过返回的json来展示。根据需要取pageinfo对象的相应属性即可。
5.pageinfo类说明
类源码(更多源码去github上查看即可):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
public class pageinfo<t> implements serializable {
private static final long serialversionuid = 1l;
//当前页
private int pagenum;
//每页的数量
private int pagesize;
//当前页的数量
private int size;
//由于startrow和endrow不常用,这里说个具体的用法
//可以在页面中"显示startrow到endrow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startrow;
//当前页面最后一个元素在数据库中的行号
private int endrow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private list<t> list;
//前一页
private int prepage;
//下一页
private int nextpage;
//是否为第一页
private boolean isfirstpage = false ;
//是否为最后一页
private boolean islastpage = false ;
//是否有前一页
private boolean haspreviouspage = false ;
//是否有下一页
private boolean hasnextpage = false ;
//导航页码数
private int navigatepages;
//所有导航页号
private int [] navigatepagenums;
//导航条上的第一页
private int navigatefirstpage;
//导航条上的最后一页
private int navigatelastpage;
public pageinfo() {
}
/**
* 包装page对象
*
* @param list
*/
public pageinfo(list<t> list) {
this (list, 8 );
}
/**
* 包装page对象
*
* @param list page结果
* @param navigatepages 页码数量
*/
public pageinfo(list<t> list, int navigatepages) {
if (list instanceof page) {
page page = (page) list;
this .pagenum = page.getpagenum();
this .pagesize = page.getpagesize();
this .pages = page.getpages();
this .list = page;
this .size = page.size();
this .total = page.gettotal();
//由于结果是>startrow的,所以实际的需要+1
if ( this .size == 0 ) {
this .startrow = 0 ;
this .endrow = 0 ;
} else {
this .startrow = page.getstartrow() + 1 ;
//计算实际的endrow(最后一页的时候特殊)
this .endrow = this .startrow - 1 + this .size;
}
} else if (list instanceof collection) {
this .pagenum = 1 ;
this .pagesize = list.size();
this .pages = this .pagesize > 0 ? 1 : 0 ;
this .list = list;
this .size = list.size();
this .total = list.size();
this .startrow = 0 ;
this .endrow = list.size() > 0 ? list.size() - 1 : 0 ;
}
if (list instanceof collection) {
this .navigatepages = navigatepages;
//计算导航页
calcnavigatepagenums();
//计算前后页,第一页,最后一页
calcpage();
//判断页面边界
judgepageboudary();
}
}
.......
}
|
这里只列出所有属性和构造方法,那么可以清晰的看到一些属性的含义,一些属性是如何初始化,并且初始化值是怎样的,更多详细情况可以自己去查看源码,都有中文注释
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000018200373