参考来自:

http://www.360doc.com/content/15/0728/15/12642656_487954693.shtml

https://www.cnblogs.com/digdeep/p/4608933.html

http://www.hifreud.com/2015/03/06/mybatis-7-Pagination/

http://www.cnblogs.com/jcli/archive/2011/08/09/2132222.html

1.物理分页和逻辑分页

 逻辑分页 : 逻辑分页指的是将数据库中所有数据全部取出,然后通过Java代码控制分页逻辑。
物理分页 : 物理分页指的是在SQL查询过程中实现分页,依托与不同的数据库厂商,实现也会不同。

2.需求

现在使用的是逻辑分页,因为出现了性能问题,考虑将其变为物理分页。ps:项目中使用的ibatis的方式,具体的旧代码后面会有 。

3.实际使用

3.0 Spring中mybatis的配置

使用PageHelper也不会影响的部分,但为了说明还是列出来和mybatis相关的文件内容:

     <!-- MyBatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
<!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
<property name="typeAliasesPackage" value="classpath:com/baosight/**/entity"/>
<!-- 显式指定Mapper文件位置 -->
<property name="mapperLocations" value="classpath:sql/**/*.xml"/>
</bean>

3.1 旧代码

来自BaseService.query()方法。主要逻辑是,当curPage=null或curRowNum=null时,不进行分页。否则进行分页处理。

重点代码如下:

         Integer curPage = (Integer) paramInfo.get("curPage");
Integer curRowNum = (Integer) paramInfo.get("curRowNum"); List<JSONObject> resultArr = new ArrayList<JSONObject>();
try {
if (curPage == null || curRowNum == null) {
resultArr = sqlSessionTemplate.selectList(querySql, daoEntity);
} else {
resultArr = sqlSessionTemplate.selectList(querySql, daoEntity,
new RowBounds((curPage - 1) * curRowNum, curRowNum));
}
} catch (Exception e) {
e.printStackTrace();
paramInfo.put("status", Constants.EXECUTE_FAIL);
paramInfo.put("returnMsg", "查询出错,请检查SQL语句!");
return paramInfo;
}

其他参数相关的代码如下:

即这里的querySql、countSql对应的是一个命名空间下的某方法。

         paramInfo.put("querySql", "GlobalMessage.querybatch");
paramInfo.put("countSql", "GlobalMessage.countbatch");
paramInfo.put("DaoEntity", "com.lyh.entity.GlobalMessage");

GlobalMessage.xml的命名空间如下:

 <mapper namespace="GlobalMessage">

queryBathch如下:显然是不带任何有关limit和offset的sql语句。

     <select id="querybatch" parameterType="com.lyh.entity.GlobalMessage"
resultType="com.alibaba.fastjson.JSONObject">
select * from t_global_message where
1 = 1
<if test="messageId != null">
and MESSAGE_ID = #{messageId}
</if>
<if test="messageKey != null and messageKey != ''" >
and MESSAGE_KEY in (${messageKey})
</if>
<if test="messageLan != null">
and MESSAGE_LAN = #{messageLan}
</if>
<if test="messageEnable != null">
and MESSAGE_ENABLE = #{messageEnable}
</if>
</select>

3.2 新代码

(1)pom.xml
        <dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
(2)mybatis的配置文件SqlMapConfig.xml

<plugins>标签内的为新增部分,即注册PageHelper。

 1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <properties resource="project.properties" />
7 <settings>
8 <setting name="logPrefix" value="dao." />
9 </settings>
19 <plugins>
20 <!-- com.github.pagehelper为PageHelper类所在包名 -->
21 <plugin interceptor="com.github.pagehelper.PageHelper">
22 <property name="dialect" value="postgresql"/>
27 <!--设置为true时,如果pagesize=0或者rowbounds.limit=0就会查询出所有的结果-->
28 <property name="pageSizeZero" value="true"/>
29 <property name="reasonable" value="true"/>
30 </plugin>
31 </plugins>
37 </configuration>
(3)代码变动
         Integer curPage = (Integer) paramInfo.get("curPage");
Integer curRowNum = (Integer) paramInfo.get("curRowNum"); PageInfo<JSONObject> pageResult;
try {
if (curPage == null || curRowNum == null) {//不分页,查询出所有
curRowNum = 0;
curPage = 0;
} PageHelper.startPage(curPage, curRowNum); //PageHelper.startPage(pageIndex,pageSize);//当前页码,每页大小
List<JSONObject> list = sqlSessionTemplate.selectList(querySql, daoEntity,
new RowBounds((curPage-1)*curRowNum, curRowNum));
pageResult = new PageInfo<>(list);
pageResult.setList(list);
} catch (Exception e) {
e.printStackTrace();
paramInfo.put("status", Constants.EXECUTE_FAIL);
paramInfo.put("returnMsg", "查询出错,请检查SQL语句!");
return paramInfo;
}

4.效果比对

使用pageHelper之前,查询时的sql语句示例如下:

 DEBUG dao.GlobalMessage.queryBatch - ==>  Preparing: select * from t_global_message where 1 = 1
DEBUG dao.GlobalMessage.queryBatch - ==> Parameters:

使用pageHelper之后,输出的sql已经拼接了limit和offset:

 DEBUG dao.GlobalMessage.queryBatch - ==>  Preparing: select * from t_global_message where 1 = 1 limit ? offset ?
DEBUG dao.GlobalMessage.queryBatch - ==> Parameters: 10 0

当在程序中传递curPage或者curRowNum为null时,根据代码,curPage和curRowNum被置为了0,此时仍然使用pageHelper,sql语句没有拼接limit和offset,将所有数据都查询出来了:

 DEBUG dao.GlobalMessage.queryBatch - ==>  Preparing: select * from t_global_message where 1 = 1
DEBUG dao.GlobalMessage.queryBatch - ==> Parameters:

2017.12.14 Mybatis物理分页插件PageHelper的使用(一)的更多相关文章

  1. 2017.12.25 Mybatis物理分页插件PageHelper的使用(二)

    参考来自: 官方文档的说明:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md 上篇博客 ...

  2. Java SSM框架之MyBatis3(三)Mybatis分页插件PageHelper

    引言 对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写count和select ...

  3. Mybatis分页插件PageHelper的配置和使用方法

     Mybatis分页插件PageHelper的配置和使用方法 前言 在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页. 前端分 ...

  4. Mybatis框架插件PageHelper的使用

    在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页. 前端分页 一次性请求数据表格中的所有记录(ajax),然后在前端缓存并且计 ...

  5. Mybatis学习---Mybatis分页插件 - PageHelper

    1. Mybatis分页插件 - PageHelper说明 如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件. 该插件目前支持Oracle,Mysql,MariaDB,S ...

  6. Mybatis分页插件PageHelper的实现

    Mybatis分页插件PageHelper的实现 前言 分页这个概念在做web网站的时候很多都会碰到 说它简单吧 其实也简单 小型的网站,完全可以自己写一个,首先查出数据库总条数,然后按照分页大小分为 ...

  7. 基于Mybatis分页插件PageHelper

    基于Mybatis分页插件PageHelper 1.分页插件使用 1.POM依赖 PageHelper的依赖如下.需要新的版本可以去maven上自行选择 <!-- PageHelper 插件分页 ...

  8. Mybatis分页插件PageHelper使用

    一. Mybatis分页插件PageHelper使用  1.不使用插件如何分页: 使用mybatis实现: 1)接口: List<Student> selectStudent(Map< ...

  9. Gitlab一键端的安装汉化及问题解决(2017/12/14目前版本为10.2.4)

    Gitlab的安装汉化及问题解决 一.前言 Gitlab需要安装的包太TM多了,源码安装能愁死个人,一直出错,后来发现几行命令就装的真是遇到的新大陆一样... ... 装完之后感觉太简单,加了汉化补丁 ...

随机推荐

  1. 201. Non Absorbing DFA

    题意好难看懂的说... 有限状态自动机DFA是这么一个有序组<Σ, U, s, T, phi>:Σ代表输入字符集,表示此自动机的工作范围:U代表所有的状态集合:s是初始状态:T是最终状态: ...

  2. Ionic-wechat项目边开发边学(三):自定义样式,指令,服务

    摘要 上一篇文章主要介绍了一个ionic项目的标准目录结构,header标签的使用,以及页面之间的切换.这篇文章实现的功能有: 消息数据的获取, 消息列表的展示, 消息标为已读/未读, 主要涉及的到的 ...

  3. MD5加密和RSA加密

    1.MD5加密  MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),MD5算法的使用不需要支付任何版权费用. MD5的功能:     ①.输入任意长 ...

  4. (7) go 函数

    1.格式 调用 2.包 (1)包 本质 文件夹.每一个文件都必须属于一个包 (2)给包取别名 (3)函数的首字母大小,决定是否能被外包访问 (3) 3.多返回值 4.递归 5.基本数据类型和数组都是拷 ...

  5. jq函数绑定与解绑

    最近学到几个新的jq函数 1.bind()绑定函数 2.unbind()解绑函数 3.add() .给元素追加字符串 4.addClass() 给某元素增加class属性值

  6. Pandas分组运算(groupby)修炼

    Pandas分组运算(groupby)修炼 Pandas的groupby()功能很强大,用好了可以方便的解决很多问题,在数据处理以及日常工作中经常能施展拳脚. 今天,我们一起来领略下groupby() ...

  7. 子查询在DELETE语句中的应用

    子查询在DELETE 中唯一可以应用的位置就是WHERE 子句,使用子查询可以完成复杂的数据删除控制.其使用方式与SELECT 语句中的子查询基本相同,而且也可以使用相关子查询等高级的特性.下面的SQ ...

  8. EXISTS运算符

    和IN.ANY.ALL等运算符不同,EXISTS运算符是单目运算符,它不与列匹配,因此它也不要求待匹配的集合是单列的.EXISTS运算符用来检查每一行是否匹配子查询,可以认为EXISTS就是用来测试子 ...

  9. Linux下屏幕截图

    Ubuntu使用教程——截屏 http://www.linuxidc.com/Linux/2014-02/96827.htm Ubuntu下使用(xfce截屏)及GNOME下一个好用的截屏工具 htt ...

  10. 机房重构包图(从三层+实体到三层+实体+外观+工厂+接口+SQLHelper)

    刚刚开始接触三层的时候,我只做了两个登录小窗体的例子.画了简单的包图,可以说,为后面机房重构留下了大量的工作(因为三层理解没有深度,也没有理解出自己的东西).不过,欠下的总要还的.在做机房重构的时候, ...