1.引入分页插件
1.引入Jar包
如果你想使用本项目的jar包而不是直接引入类,你可以在这里下载各个版本的jar包(点击Download下的jar即可下载)
https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/
http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
由于使用了sql解析工具,你还需要下载jsqlparser.jar(这个文件完全独立,不依赖其他):
2. 在Mybatis配置xml中配置拦截器插件:
<!-- 这个地方要注意,放到你mybatis的配置文件xml里的时候,这个插件所对应的位置。 plugins ----在配置文件中的位置必须符合要求,否则会报错,顺序如下:---- properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,objectWrapperFactory?, plugins?, -----应该放在此处----- environments?, databaseIdProvider?, mappers? --> <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <property name="dialect" value="mysql"/> <!-- 该参数默认为false --> <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 --> <!-- 和startPage中的pageNum效果一样--> <property name="offsetAsPageNum" value="true"/> <!-- 该参数默认为false --> <!-- 设置为true时,使用RowBounds分页会进行count查询 --> <property name="rowBoundsWithCount" value="true"/> <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 --> <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)--> <property name="pageSizeZero" value="true"/> <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 --> <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 --> <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 --> <property name="reasonable" value="true"/> <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 --> <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 --> <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 --> <!-- 不理解该含义的前提下,不要随便复制该配置 --> <property name="params" value="pageNum=start;pageSize=limit;"/> </plugin> </plugins>
3. 在Mybatis配置xml中配置拦截器插件:
如何在代码中使用
首先该分页插件支持以下两种调用方式:
//第一种,RowBounds方式的调用
List<XXX> list = sqlSession.selectList("<-- xxx.xml当中的配置id -->", null, new RowBounds(1, 10));
//第二种,Mapper接口方式的调用,推荐这种使用方式。
//小弟深深感受到了面向接口编程神奇之处。各位大大见笑了。
PageHelper.startPage(1, 10);List<Country> list = countryMapper.selectIf(1);
为何要用此插件?
mybatis提供的分页效率低。
Select * from user limit #{p1},#{p2}传统的分页有何不足之处?
Select * from user limit #{p1},#{p2} mybatis内部在看到jdbc的Resultset对象时,用游标定位offset的位置,只处理limit条记录。
场景:当数据库105万条数据,1万1页,我要查第一百页,那就是第1000001到条1010000条,使用这种分页查询,先是查询全部105万条,然后截取所对应页码的记录,效率不行。
主要工作原理是什么?
这个我大体上知道那么回事,真正让我追本溯源现在还没有那个实力。
主要思想:拦截handleResultSets方法来获取最后的处理结果。
如果要在Spring里面集成这个分页插件,请浏览原文。
http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown
欢迎指正,欢迎交流