Mybatis分页插件PageHelper的使用
2017-10-28 02:23
357 查看
PageHelper项目地址:
oschub的项目地址:http://git.oschina.net/free/Mybatis_PageHelpergithub的项目地址:https://github.com/pagehelper/Mybatis-PageHelper
PageHelper的使用例子
https://gitee.com/xuguolong/mybatis-pagehelper-sample这个大家再熟悉不过的MySQL的分页查询语句
select * from t_user limit 0 , 15
1、简单了解分页的几个关键要素
页码(pageNum): 即表示当前查询第几页的数据每页大小(pageSize):即每页显示的记录数
总页数 :当前查询满足条件的总页数,总页数 = 总记录数/pageSize
总记录数:当前查询满足条件的总记录条数
2、分页的基本思想
根据pageNum和pageSize计算它的数据偏移量从当前数据偏移量开始,取出pageSize条记录
3、不使用插件,使用Mybatis自带的RowBounds实现分页
使用Mybatis自带的分页功能(PageBounds)RowBounds rowBounds = new RowBounds(0 ,10); List<User> users = userMapper.selectUserListWithRowBounds(null ,rowBounds); System.out.println(users); for(User user :users){ System.out.println(user); }
缺点:
1、内存中分页,即它会先把所有满足条件的数据都查询出来,然后再在内存中筛选分页数据,这个对于大数据量的情况下,是非常致命的。
2、没有统计总记录数、总页数需要自己计算
自己实现分页功能
/** * 自己实现分页逻辑 */ @Test public void page2() { List<User> users = userMapper.selectUserListForPage(null ,null ,10 ,15); System.out.println(users); for(User user :users){ System.out.println(user); } } xml配置: <!--自己实现分页逻辑 --> <select id="selectUserListForPage" parameterType="map" resultType="com.xgl.mybatis.study.model.User"> select * from tb_user <where> <if test="id !=null"> and id=#{id} </if> <if test="name != null "> and name=#{name} </if> </where> limit #{pageOffset} ,#{pageSize} </select>
缺点:
1、总记录数、总页数需要自己计算
2、代码不能重复利用
3、需要针对不同的数据库实现不同的分页逻辑,例如Oracle和MySQL的分页逻辑是不同的
4、对原有业务代码有一定的入侵
4、如何使用Mybatis-PageHelper分页插件
使用分页插件,使我们专注与业务逻辑的开发,而不需要关心分页逻辑的实现,甚至,对于dao层来说,完全感觉不到分页的存在。Mybatis-PageHelper是一个非常简单好用的分页插件,因此,这里给大家分享下如何使用。1、首先导入Mybatis-PageHelper相关依赖jar包
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
2、在Mybatis配置文件mybatis-config.xml增加分页插件配置
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!--一些可选的配置参数 --> </plugin> </plugins>
3、在代码中使用
前面讲过了,分页基本思想就是通过 页码和页大小来获取分页数据。Mybatis-PageHelper的分页原理就是拦截你的查询方法,然后看看有没有同时存在pageNum和pageSize两个参数,如果有,则进行分页处理,否则不做分页处理。
因此,如果我们需要分页,就应该想办法将pageNum和pageSize传递给Mybatis-PageHelper插件。主要有以下几种方式
分页方式一:使用Mybatis自带的RowBounds类来传递
Mybatis-PageHelper支持使用Mybatis自带的分页类RowBounds来传入分页参数。默认情况下,这种方式不会进行数据统计(即没有总页数和总记录数),如果需要这些返回信息,需要在配置插件使,配置一下属性
配置代码: <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="offsetAsPageNum" value="true" /> <property name="rowBoundsWithCount" value="true" /> </plugin> </plugins> 程序编码: List<User> userList = userMapper.selectUserListWithRowBounds( null ,new RowBounds( 0,10)); for(User user: userList){ System.out.println(user); } //如果使用RowBounds方式传递分页参数,那么需要配置rowBoundsWithCount=true才能得到以下返回参数 Page page = (Page) userList; System.out.println("总记录数:" + page.getTotal()); System.out.println("总页数:" + page.getPages()); System.out.println("当前页:" + page.getPageNum()); System.out.println("每页记录数:" + page.getPageSize());
搭配建议:RowBounds + 配置offsetAsPageNum=true + 配置 rowBoundsWithCount=true
分页方式二:PageHelper的startPage(pageNum ,pageSize)静态方法
int pageNum = 1; int pageSize = 10; //获取第一页 PageHelper.startPage(pageNum++ ,pageSize); //每次都要执行 List<User> userList = userMapper.selectUserList( new User()); for(User user: userList){ System.out.println(user); } Page page = (Page) userList; System.out.println("总记录数:" + page.getTotal()); System.out.println("总页数:" + page.getPages()); System.out.println("当前页:" + page.getPageNum()); System.out.println("每页记录数:" + page.getPageSize()); System.out.println("----------------------------------------------------------"); //获取第二页 PageHelper.startPage(pageNum++,pageSize); //每次都要执行 userList = userMapper.selectUserList( new User()); for(User user: userList){ System.out.println(user); }
注意:
只有紧跟着PageHelper.startPage今天方法后的第一个sql才会执行分页
每次分页都要先执行PageHelper.startPage方法
分页方式三:在Mapper接口方法中增加pageNum ,pageSize两个参数
即在Mapper接口方法中定义pageNum ,pageSize两个参数,如果使用此种方式进行分页,则还需要在mybatis-config.xml配置分页插件时,配置 supportMethodsArguments为true
mybatis-config.xml中插件配置:
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="supportMethodsArguments" value="true" /> </plugin> </plugins>
Mapper接口方法定义:
List<User> selectUserListForParam(@Param("id") String id ,@Param("name") String name , @Param("pageNum") int pageNum , @Param("pageSize") int pageSize);
代码中使用分页
int pageNum = 1; int pageSize = 10; //获取第一页 List<User> userList = userMapper.selectUserListForParam( null ,null ,pageNum++ ,pageSize); for(User user: userList){ System.out.println(user); } Page page = (Page) userList; System.out.println("总记录数:" + page.getTotal()); System.out.println("总页数:" + page.getPages()); System.out.println("当前页:" + page.getPageNum()); System.out.println("每页记录数:" + page.getPageSize()); System.out.println("----------------------------------------------------------"); //获取第二页 userList = userMapper.selectUserListForParam( null ,null ,pageNum++ ,pageSize); for(User user: userList){ System.out.println(user); }
分页方式四:通过对象属性(包含pageSize和pageNum属性)
public class User { private Long id; private String name; private Integer age; private Integer sex; private int pageNum; private int pageSize; }
程序中使用分页
User param = new User(); param.setPageSize(10); param.setPageNum(1); //获取第一页 List<User> userList = userMapper.selectUserList(param); for(User user: userList){ System.out.println(user); } Page page = (Page) userList; System.out.println("总记录数:" + page.getTotal()); System.out.println("总页数:" + page.getPages()); System.out.println("当前页:" + page.getPageNum()); System.out.println("每页记录数:" + page.getPageSize()); System.out.println("----------------------------------------------------------"); //获取第二页 param.setPageNum(2); userList = userMapper.selectUserList(param); for(User user: userList){ System.out.println(user); }
4、获取分页结果
其实,主要在mybatis-config.xml中配置了mybatis-pagehelper分页插件之后,不管是否执行分页,返回结果都是
mybatis-pagehelper封装的Page对象,所有相关的分页信息都保存在该对象中。
//获取第一页 List<User> userList = userMapper.selectUserListForMap(param); for(User user: userList){ System.out.println(user); } Page page = (Page) userList; System.out.println("总记录数:" + page.getTotal()); System.out.println("总页数:" + page.getPages()); System.out.println("当前页:" + page.getPageNum()); System.out.println("每页记录数:" + page.getPageSize());
相关文章推荐
- mybatis分页插件PageHelper的使用
- mybatis框架---分页插件PageHelper的使用方法
- MyBatis分页插件PageHelper的使用
- Mybatis 的分页插件PageHelper-4.1.1的使用
- 商城项目实战14:MyBatis分页插件(PageHelper)的使用以及商品列表展示
- MyBatis分页插件PageHelper的使用
- Mybatis分页插件-PageHelper的使用
- 使用mybatis分页插件PageHelper5.0.0遇到的问题总结
- Mybatis的插件 PageHelper 分页查询使用方法
- MyBatis的分页插件PageHelper的简单使用
- MyBatis分页插件:比PageHelper都要简单,使用很灵活,目前支持Oracle和MySQL
- mybatis 分页插件pagehelper集成及使用
- MyBatis分页插件PageHelper的使用
- MyBatis分页插件PageHelper的使用
- Mybatis 的分页插件PageHelper-4.1.1的使用
- 【MyBatis】MyBatis分页插件PageHelper的使用
- 2017.12.14 Mybatis物理分页插件PageHelper的使用(一)
- Mybatis分页插件PageHelper正确的使用方法(网上有2篇不够科学的文章)
- Mybatis使用分页插件PageHelper做分页查询
- mybatis3.4.2分页插件 pagehelper5.0.0使用