zoukankan      html  css  js  c++  java
  • 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 两个属性同时存在才会触发分页操作,在这个前提下,其他的分页参数才会生效。

  • 相关阅读:
    MySQL之pymysql模块
    MySQL 之 索引原理与慢查询优化
    MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁
    MySql之数据操作
    MySQL之多表查询
    MySQL之单表查询
    MySQL之表的约束
    MySQL之表操作
    MySQL之表的数据类型
    pycharm 2016 注册(pycharm-professional-2016.3.2)
  • 原文地址:https://www.cnblogs.com/flypig666/p/11732163.html
Copyright © 2011-2022 走看看