1.什么是分页
分页(Pagination)是指将大量数据划分为多个页面进行展示的一种技术手段。在数据量较大的情况下,将所有数据一次性显示在页面上会导致加载时间过长和页面过于庞大,影响用户体验和系统性能。分页技术通过划分数据为多个页面,并提供导航控制,使用户可以按需加载和浏览数据。
通常的分页方式是根据指定的每页显示数量,将数据分为多个独立的页,每页呈现一定数量的数据。用户可以通过页码或者上一页、下一页等导航控件来切换不同的页。常见的分页信息包括当前页码、总页数、总记录数等。
如上,当我们在百度上查询的时候,查询结果通常分页展示。而在mybatis中,我们可以使用两种方式实现分页,
一是通过sql语句的limit关键字实现,二是通过Mybatis插件 PageHelper实现
2.sql语句实现分页查询
select * from account limit 起始位置 每页显示数量
如上,我们需要两个关键参数,查询的起始位置,每页显示的最大数量。
测试起始位置为2,每页显示数量最大为3
映射文件:
<select id="selectByPage" resultMap="AccountMap">select * from account limit #{offset} ,#{pageNums};
</select>
mapper接口对应的方法:
List<Account> selectByPage(@Param("offset") int offset,@Param("pageNums") int pageNums);
测试方法:
@Test
public void sqlTest3(){AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);List<Account> accounts = accountMapper.selectByPage(2, 3);System.out.println(accounts);
}
初始数据:
查询结果:
3. PageHelper实现分页
PageHelper 是一个非常流行的 MyBatis 分页插件,它能够简化基于 MyBatis 的分页查询操作,并提供了丰富的分页查询功能。使用 PageHelper 可以在 MyBatis 中非常便捷地实现分页查询。
PageHelper 提供的功能包括:
- 自动进行分页查询,无需手动编写分页 SQL 语句。
- 支持多种数据库,如 MySQL、Oracle、SQL Server 等。
- 提供丰富的分页参数设置,如页码、页面大小、是否计算总数等。
- 支持排序功能,可以方便地指定排序字段和排序方式。
1.导入依赖
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version>
</dependency>
2.配置分页拦截器
mybatis核心配置文件中,注意标签的顺序
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
3.编写映射文件
<select id="selectByPageHelper" resultMap="AccountMap">select * from account
</select>
4.编写接口
List<Account> selectByPageHelper();
5.测试
@Test
public void sqlTest4(){AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);//开启分页功能PageHelper.startPage(1, 3);//从第一页开始,页面中条数最大数量为3List<Account> accounts = accountMapper.selectByPageHelper();System.out.println(accounts);
}
6.结果
在这个实例中我们不用在关系sql中limit关键字,PageHelper已经帮我们实现了,只需开启分页功能。
注意,第一条数据是从0开始的。
4.PageInfo获取分页详细信息
在 MyBatis 分页插件 PageHelper 中,PageInfo 对象是一个非常便利的类,用于包装分页后的结果,提供了获取分页详细信息的各种方法。
@Test
public void sqlTest4(){AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);//开启分页功能PageHelper.startPage(1, 3);List<Account> accounts = accountMapper.selectByPageHelper();PageInfo<Account> pageInfo=new PageInfo<>(accounts);//只需传入System.out.println(pageInfo.toString());System.out.println(accounts);
}
- getList():获取当前页的数据列表。
- getTotal():获取总记录数。
- getPages():获取总页数。
- getPageNum():获取当前页的页码。
- getPageSize():获取每页显示的条目数。
- isHasNextPage():判断是否有下一页。
- isHasPreviousPage():判断是否有前一页。
- getNavigatepageNums():获取所有导航页的页码。