Mybatis 的分页插件PageHelper-4.1.1的使用
来源:互联网 发布:淘宝 御品电动尾门 编辑:程序博客网 时间:2024/06/03 21:39
1、maven
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.0.0</version> </dependency>
2、基于spring的配置(spring-config-datasource.xml)
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="mapperLocations" value="classpath*:/sqlmap/db/**/*Mapper.xml"/> <property name="dataSource" ref="dataSource"/> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageHelper"> <property name="properties"> <value> dialect=mysql offsetAsPageNum=true rowBoundsWithCount=true pageSizeZero=true reasonable=false supportMethodsArguments=false returnPageInfo=none </value> </property> </bean> </array> </property> </bean>
这里也可以在mybatis-config.xml里配置,有兴趣的话可以百度下。
3、使用方法
pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息。
所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句。
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句。
PageHelper只对紧跟着的第一个SQL语句起作用
如上:所以若一个方法中涉及到多个查询,需要小心,避免为不需要分页的添加了分页,而真正需要分页的却没有被分页。
1)、统计总数,(将SQL语句变为 select count(0) from xxx,只对简单SQL语句其效果,复杂SQL语句需要自己写)
Page<?> page = PageHelper.startPage(1,-1);
long count = page.getTotal();
2)、分页,pageNum - 第N页, pageSize - 每页M条数
A、只分页不统计(每次只执行分页语句)
PageHelper.startPage([pageNum],[pageSize]);
List<?> pagelist = queryForList( xxx.class, “queryAll” , param);
//pagelist就是分页之后的结果
B、分页并统计(每次执行2条语句,一条select count语句,一条分页语句)适用于查询分页时数据发生变动,需要将实时的变动信息反映到分页结果上
Page<?> page = PageHelper.startPage([pageNum],[pageSize],[iscount]);
List<?> pagelist = queryForList( xxx.class , “queryAll” , param);
long count = page.getTotal();
//也可以 List<?> pagelist = page.getList(); 获取分页后的结果集
3)、使用PageHelper查全部(不分页)
PageHelper.startPage(1,0);
List<?> alllist = queryForList( xxx.class , “queryAll” , param);
4)、PageHelper的其他API
String orderBy = PageHelper.getOrderBy(); //获取orderBy语句
Page<?> page = PageHelper.startPage(Object params);
Page<?> page = PageHelper.startPage(int pageNum, int pageSize);
Page<?> page = PageHelper.startPage(int pageNum, int pageSize, boolean isCount);
Page<?> page = PageHelper.startPage(pageNum, pageSize, orderBy);
Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable); //isReasonable分页合理化,null时用默认配置
Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable, isPageSizeZero); //isPageSizeZero是否支持PageSize为0,true且pageSize=0时返回全部结果,false时分页,null时用默认配置
5)、默认值
//RowBounds参数offset作为PageNum使用 - 默认不使用
private boolean offsetAsPageNum = false;
//RowBounds是否进行count查询 - 默认不查询
private boolean rowBoundsWithCount = false;
//当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果
private boolean pageSizeZero = false;
//分页合理化
private boolean reasonable = false;
//是否支持接口参数来传递分页参数,默认false
private boolean supportMethodsArguments = false;
附:count(*)和count(0)和count(列)
之前有人说过,在使用count的时候要用count(1)而不要用count(*),因为使用count(*)的时候会对所有的列进行扫描,相比而言count(1)不用扫描所有列,所以count(1)要快一些。
然而实际并非如此。
1、通过实验测试,也就说明count(*)和count(1)的执行效率是完全一样的,根本不存在所谓的单列扫描和多列扫描的问题。mysql底层自动做了优化。
2、大家以为count(*)和count(列)哪个更快些?相信很多人会以为,肯定count(列)更快些。而事实恰恰相反,count(*)只是返回表中行数,因此在处理count(*)的时候只需要找到属于表的数据块块头,然后计算一下行数就行了,而不用去读取里面数据列的数据。
而对于count(col)就不一样了,为了去除col列中包含的NULL行,SQL Server必须读取该col的每一行的值,然后确认下是否为NULL,然后在进行计数。
因此count(*)比count(col)在大数据量时要快很多。
3、count(*)和count(1)时统计包括null的,而只有count(有空值的列)不包含null值。(结合上一条理解)。
还有一些和索引相关的性能因素可参考下面文章:
http://www.cnblogs.com/sueris/p/6650301.html
- Mybatis 的分页插件PageHelper-4.1.1的使用
- Mybatis 的分页插件PageHelper-4.1.1的使用
- Mybatis 的分页插件PageHelper-4.1.1的使用
- Mybatis 的分页插件PageHelper-4.1.1的使用
- Mybatis 的分页插件PageHelper-4.1.1的使用
- Mybatis 的分页插件PageHelper-4.1.1的使用
- 【MyBatis】MyBatis分页插件PageHelper的使用
- 【MyBatis】MyBatis分页插件PageHelper的使用
- 【MyBatis】MyBatis分页插件PageHelper的使用
- Mybatis中分页插件PageHelper的使用
- Mybatis分页插件-PageHelper的使用
- mybatis分页插件PageHelper的使用
- Mybatis分页插件PageHelper的使用
- MyBatis分页插件PageHelper的使用
- Mybatis分页插件PageHelper的使用
- Mybatis分页插件PageHelper的简单使用
- MyBatis分页插件PageHelper的使用
- Mybatis分页插件-PageHelper(5.0)的使用
- LeetCode Median of Two Sorted Arrays
- cordova 提交iOS APP 需要注意的点
- Spring Boot 热部署与日志配置
- java学习笔记(二十五)模拟斗地主发牌与洗牌
- perl 十六进制转二进制
- Mybatis 的分页插件PageHelper-4.1.1的使用
- scikit-learn中离散特征二值化
- 单纯形求解线性规划
- TPCH测试脚本
- Android Studio中Git的配置及协同开发
- 从图片中抓取文字
- 一个数组实现两个栈
- 第三册DNS
- jdk1.8降级