1.引入分页插件

1.引入Jar包

如果你想使用本项目的jar包而不是直接引入类,你可以在这里下载各个版本的jar包(点击Download下的jar即可下载)


由于使用了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



欢迎指正,欢迎交流