Mybatis的插件 PageHelper 分页查询使用方法
Posted 小飞猪咯咯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis的插件 PageHelper 分页查询使用方法相关的知识,希望对你有一定的参考价值。
参考:https://blog.csdn.net/ckc_666/article/details/79257028
Mybatis的一个插件,PageHelper,非常方便mybatis分页查询,国内牛人的一个开源项目
github:https://github.com/pagehelper/Mybatis-PageHelper
使用文档:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
结合example使用例子:
@Service public class BrandService { @Autowired private BrandMapper brandMapper; /** * 根据查询条件分页并排序查询品牌信息 * @param key * @param page * @param rows * @param sortBy * @param desc * @return */ public PageResult<Brand> queryBrandsByPage(String key, Integer page, Integer rows, String sortBy, Boolean desc) { // 初始化example对象 Example example = new Example(Brand.class); Example.Criteria criteria = example.createCriteria(); // 根据name模糊查询,或者根据首字母查询 if (StringUtils.isNotBlank(key)) { criteria.andLike("name","%" + key + "%").orEqualTo("letter",key); } // 添加分页条件 PageHelper.startPage(page,rows); // 添加排序条件 if (StringUtils.isNotBlank(sortBy)) { // 通过判断desc是true还是false,确定升序还是降序 example.setOrderByClause(sortBy + " " + (desc ? "desc" : "asc")); // 相当于“id desc” } // 将查询到的结果保存在Brand类型的list中 List<Brand> brands = this.brandMapper.selectByExample(example); // 包装成pageInfo PageInfo<Brand> pageInfo = new PageInfo<>(brands); // 包装成分页的结果集返回 return new PageResult<>(pageInfo.getTotal(),pageInfo.getList()); } }
搬运文档部分代码:
PageHelper.startPage
静态方法调用
除了 PageHelper.startPage
方法外,还提供了类似用法的 PageHelper.offsetPage
方法。
在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage
静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
例一:
//获取第1页,10条内容,默认查询总数count PageHelper.startPage(1, 10); //紧跟着的第一个select方法会被分页 List<Country> list = countryMapper.selectIf(1); assertEquals(2, list.get(0).getId()); assertEquals(10, list.size()); //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E> assertEquals(182, ((Page) list).getTotal());
例二:
//request: url?pageNum=1&pageSize=10 //支持 ServletRequest,Map,POJO 对象,需要配合 params 参数 PageHelper.startPage(request); //紧跟着的第一个select方法会被分页 List<Country> list = countryMapper.selectIf(1); //后面的不会被分页,除非再次调用PageHelper.startPage List<Country> list2 = countryMapper.selectIf(null); //list1 assertEquals(2, list.get(0).getId()); assertEquals(10, list.size()); //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>, //或者使用PageInfo类(下面的例子有介绍) assertEquals(182, ((Page) list).getTotal()); //list2 assertEquals(1, list2.get(0).getId()); assertEquals(182, list2.size());
例三,使用PageInfo
的用法:
//获取第1页,10条内容,默认查询总数count PageHelper.startPage(1, 10); List<Country> list = countryMapper.selectAll(); //用PageInfo对结果进行包装 PageInfo page = new PageInfo(list); //测试PageInfo全部属性 //PageInfo包含了非常全面的分页属性 assertEquals(1, page.getPageNum()); assertEquals(10, page.getPageSize()); assertEquals(1, page.getStartRow()); assertEquals(10, page.getEndRow()); assertEquals(183, page.getTotal()); assertEquals(19, page.getPages()); assertEquals(1, page.getFirstPage()); assertEquals(8, page.getLastPage()); assertEquals(true, page.isFirstPage()); assertEquals(false, page.isLastPage()); assertEquals(false, page.isHasPreviousPage()); assertEquals(true, page.isHasNextPage());
使用参数方式:
想要使用参数方式,需要配置 supportMethodsArguments
参数为 true
,同时要配置 params
参数。 例如下面的配置:
<plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --> <property name="supportMethodsArguments" value="true"/> <property name="params" value="pageNum=pageNumKey;pageSize=pageSizeKey;"/> </plugin> </plugins>
在 MyBatis 方法中:
List<Country> selectByPageNumSize( @Param("user") User user, @Param("pageNumKey") int pageNum, @Param("pageSizeKey") int pageSize);
当调用这个方法时,由于同时发现了 pageNumKey
和 pageSizeKey
参数,这个方法就会被分页。params 提供的几个参数都可以这样使用。
除了上面这种方式外,如果 User 对象中包含这两个参数值,也可以有下面的方法:
List<Country> selectByPageNumSize(User user);
当从 User 中同时发现了 pageNumKey
和 pageSizeKey
参数,这个方法就会被分页。
注意:pageNum
和 pageSize
两个属性同时存在才会触发分页操作,在这个前提下,其他的分页参数才会生效。
以上是关于Mybatis的插件 PageHelper 分页查询使用方法的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis插件原理和PageHelper结合实战分页插件