2017.12.14 Mybatis物理分页插件PageHelper的使用(一)
参考来自:
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的使用(一)的更多相关文章
- 2017.12.25 Mybatis物理分页插件PageHelper的使用(二)
参考来自: 官方文档的说明:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md 上篇博客 ...
- Java SSM框架之MyBatis3(三)Mybatis分页插件PageHelper
引言 对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写count和select ...
- Mybatis分页插件PageHelper的配置和使用方法
Mybatis分页插件PageHelper的配置和使用方法 前言 在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页. 前端分 ...
- Mybatis框架插件PageHelper的使用
在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页. 前端分页 一次性请求数据表格中的所有记录(ajax),然后在前端缓存并且计 ...
- Mybatis学习---Mybatis分页插件 - PageHelper
1. Mybatis分页插件 - PageHelper说明 如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件. 该插件目前支持Oracle,Mysql,MariaDB,S ...
- Mybatis分页插件PageHelper的实现
Mybatis分页插件PageHelper的实现 前言 分页这个概念在做web网站的时候很多都会碰到 说它简单吧 其实也简单 小型的网站,完全可以自己写一个,首先查出数据库总条数,然后按照分页大小分为 ...
- 基于Mybatis分页插件PageHelper
基于Mybatis分页插件PageHelper 1.分页插件使用 1.POM依赖 PageHelper的依赖如下.需要新的版本可以去maven上自行选择 <!-- PageHelper 插件分页 ...
- Mybatis分页插件PageHelper使用
一. Mybatis分页插件PageHelper使用 1.不使用插件如何分页: 使用mybatis实现: 1)接口: List<Student> selectStudent(Map< ...
- Gitlab一键端的安装汉化及问题解决(2017/12/14目前版本为10.2.4)
Gitlab的安装汉化及问题解决 一.前言 Gitlab需要安装的包太TM多了,源码安装能愁死个人,一直出错,后来发现几行命令就装的真是遇到的新大陆一样... ... 装完之后感觉太简单,加了汉化补丁 ...
随机推荐
- [水煮 ASP.NET Web API2 方法论](1-2)在 WebForm 应用程序中添加 ASP.NET Web API
问题 怎么样将 Asp.Net Web Api 加入到 Asp.Net Web From 应用程序中 解决方案 在 Visual Studio 2013 中,创建新的 Web From,可以直接在&q ...
- webpack分离第三方库(CommonsChunkPlugin并不是分离第三方库的好办法DllPlugin科学利用浏览器缓存)
webpack算是个磨人的小妖精了.之前一直站在glup阵营,使用browserify打包,发现webpack已经火到爆炸,深怕被社区遗落,赶紧拿起来把玩一下.本来只想玩一下的.尝试打包了以后,就想启 ...
- gvim 编辑器配置
"关才兼容模式 set nocompatible "模仿快捷键,如:ctrt+A 全选.Ctrl+C复制. Ctrl+V 粘贴等 source $VIMRUNTIME/vimrc_ ...
- java中的object... args参数
关于java方法中Object... args参数的含义 在阅读google发布的volley源码时,突然看到一个方法中存在这样的写法,如 :v(String format, Object... ar ...
- HDU 4888 Redraw Beautiful Drawings
网络流. $s$向每一个$r[i]$连边,容量为$r[i]$. 每一个$r[i]$向每一个$c[j]$连边,容量为$k$. 每一个$c[j]$向$t$连边容量为$c[j]$. 跑最大流,中间每一条边上 ...
- RedisDesktopManager-0.9.3 for windows (转)
redis数据库的可视化工具 官方出了RedisDesktopManager-0.9.8版本后要购买了.之前自用的Windows版本0.9.3.817有需要的可以使用.解压直接启动即可.主要以备自用! ...
- 洛谷——P1748 H数
P1748 H数 题目背景 无 题目描述 所谓H数,是指只含有2,3,5,7这些质因数的数,如630是H数,而22不是.现在要求输出第n个H数,为了方便起见将H[1]定为1.已知n不超过10000,最 ...
- HDU 6373 Pinball
Pinball Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- Java中的对象池技术
java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...
- BZOJ 1257 [CQOI2007]余数之和sum(分块)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1257 [题目大意] 给出正整数n和k,计算j(n,k)=k mod 1 + k mod ...