MyBatis分页实现
Mybatis提供了逻辑分页使用类RowBounds实现分页,先把数据记录全部查询出来,然在再根据offset和limit截断记录返回(数据量大的时候会造成内存溢出)。
逻辑分页和物理分页的区别:
逻辑分页:查询所有数据,再对结果集进行分页,只取需要的数据,其他舍弃
物理分页:每次都需要查询数据库,只从数据库查询出需要分页的数据
Mybatis分页RowBounds实现
RowBounds rowBounds1 = new RowBounds(0, 1);
List tempEntity1 = sqlSession.selectList("com.mybatis.TempDao.list", null, rowBounds1);
Mapper.xml中的SQL:
<select id="list" resultType="com.mybatis.TempEntity">
select * from temp
select>
Mybatis分页插件PageHelper实现
1.pom.xml添加依赖
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>3.4.2version>
dependency>
<dependency>
<groupId>com.github.jsqlparsergroupId>
<artifactId>jsqlparserartifactId>
<version>0.9.1version>
dependency>
2.mybatis.xml添加插件
<configuration>
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>//方言设置
plugin>
plugins>
configuration>
3.代码开启分页
PageHelper.startPage(3, 1);
List list = sqlSession.selectList("com.mybatis.TempDao.selectTemp");
for (TempEntity t : list)
{
System.out.println(t);
}
select * from temp
ok我们来整理一下各个分页的参数
1.SELECT * FROM temp LIMIT 1,2;
//第一个参数是数据库索引,表示从第几条数据开始查,默认索引是0;第二个参数是查几条数据,也就是分页的每个数据量
2. RowBounds rowBounds1 = new RowBounds(0, 1);
//参数和Limit一样都是索引下标和每页数据量
3.PageHelper.startPage(3, 1);
//第一个参数是当前页页码,也就是从第几页开始查;第二个参数是每个数据量
我们来看看PageHelper.startPage(3, 1);干了什么
1.将分页数据存到一个ThreadLocal中,分页参数和线程是绑定的


2.什么时候用分页数据


在数据查询之前会执行PageHelper中的intercept方法,从而获取ThreadLocal中的分页信息
- 每个线程在执行一次PageHelper.startPage(xx, xx)之后只能执行一次分页查询,因为每次分页查询后会把当前线程中的page对象清除掉。所以,如果要在同一个线程中做多个分页查询,那么在每个分页查询之前执行对应的PageHelper.startPage(xx, xx)。分页查询后清除掉当前线程中的page对象
- 总之,就是PageHelper利用mybatis提供的拦截器,取得ThreadLocal中的分页数据,重新拼装分页SQL,完成分页。