在讲解PageHelper插件做分页之前先来介绍几种简单的分页方法:
方法一: 数组方式
先查询出符合条件的所有记录,然后利用list的subList(firstIndex,lastIndex)来实现分页
List<InfoEmpty> infoEmpties=mapper.seletBlog(1);
infoEmptyies.subList(1,3);
这种分页称为逻辑分页缺点就是数据库查询返回的数据任然是大量的数据,没有降级查询性能,只符合数据量较少的时候进行使用(工作共不建议使用);
方式二: mybatis底层其实帮我们做了分页 利用RowBounds
BlogMapper mapper = session.getMapper(BlogMapper.class);
List<InfoEmpty> infoEmpties = mapper.selectBlog(1,new RowBounds(0,10));
session.commit();
System.out.println(infoEmpties.size());
需要在Dao层加上参数:
方式三: 利用pageHelper的方式进行分页,这个也是我今天主要讲的一种方式:
如何使用:
步骤一: 添加maven依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.1</version>
</dependency>
第二步:在mybatis-config.xml中添加PageHelper的插件
<configuration>
<properties resource="jdbc.properties">
</properties>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="reasonable" value="true"/>
</plugin>
</plugins>
</configuration>
第三步:直接使用即可
public static void main(String[] args) throws IOException {
String resource="mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//通过SqlSessionFactoryBuilder创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session= sqlSessionFactory.openSession();
BlogMapper mapper = session.getMapper(BlogMapper.class);
PageHelper.startPage(1,10);
InfoEmpty infoEmpties = mapper.selectBlog4(2);
System.out.println(infoEmpties.getName());
// System.out.println(infoEmpties.get(0).getId());
session.commit();
}
原理:
动态代理+拦截器
1. 加载配置文件
如果看过mybatis底层源码的同学一定会mybatis配置文件的扫描以及加载非常清楚
直接进入到build方法中------>进入parser.parse()中
进入到parseConfiguration 中
这里我们可以看到有很多的解析方法,今天我们主要分析的是mybatis的分页插件,所以我们就看plugins即可,其他的两个在后面的博客中会给大家介绍:
进入到this.pluginElement解析plugin插件的方法中:
通过上面的一系列工作,加载了全局配置文件以及mapper映射文件,并且将拦截器加入到了拦截器链中
2. 那么拦截器是拦截的谁? --- Executor 为什么这样说? 看下图:
下面分析在创建Executor的过程 发生了什么?
所以当执行Executor.query()的时候先会执行增强了的代理类的invoke方法:
在interceptor.intercept中对我们要 查询的sql进行了拦截并且对sql语句添加了 Limit。并且在intercept内用修改之后的SQL 语句执行了Executor.query方法真正的去做了查询的工作
总之: PageHelper分页的实现原来是在我们执行SQL语句之前动态的将SQL语句拼接了分页的语句,从而实现了从数据库中分页获取的过程。