PageHelper简单使用

PageHelper简单使用

1. 简介

PageHelper是国内优秀的开源的mybatis分页插件,支持主流常用的数据库。

【官网】https://pagehelper.github.io/

2. 使用方法【Maven】

  1. 导入依赖

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>最新版本</version>
    </dependency>
    
  2. 配置拦截器插件

    特别注意,新版拦截器是 com.github.pagehelper.PageInterceptorcom.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。

  3. mybatis中xml配置

    <!--
        plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
        properties?, settings?,
        typeAliases?, typeHandlers?,
        objectFactory?,objectWrapperFactory?,
        plugins?,
        environments?, databaseIdProvider?, mappers?
    -->
    <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
            <property name="param1" value="value1"/>
    	</plugin>
    </plugins>
    
  4. spring配置文件中配置拦截器插件

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <!-- 注意其他配置 -->
      <property name="plugins">
        <array>
          <bean class="com.github.pagehelper.PageInterceptor">
            <property name="properties">
              <value>
                params=value1
              </value>
            </property>
          </bean>
        </array>
      </property>
    </bean>
    

    常用的配置:

    • helperDialect:指定数据库,例如MySQL、db2、oracle
    • reasonable:分页合理化参数,默认值为 false 。当该参数设置为 true 时, pageNum<=0 时会查询第一 页, pageNum>pages (超过总数时),会查询最后一页。
  5. 常用方法

    RowBounds方式的调用

    List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
    
    • 使用这种调用方式时,你可以使用RowBounds参数进行分页,这种方式侵入性最小,我们可以看到,通过RowBounds方式调用只是使用了这个参数,并没有增加其他任何内容。

    • 分页插件检测到使用了RowBounds参数时,就会对该查询进行物理分页

    • 关于这种方式的调用,有两个特殊的参数是针对 RowBounds 的,你可以参看上面的 场景一场景二

    • **注:**不只有命名空间方式可以用RowBounds,使用接口的时候也可以增加RowBounds参数,例如:

    //这种情况下也会进行物理分页查询
    List<Country> selectAll(RowBounds rowBounds);  
    
    • 注意: 由于默认情况下的 RowBounds 无法获取查询总数,分页插件提供了一个继承自 RowBoundsPageRowBounds,这个对象中增加了 total 属性,执行分页查询后,可以从该属性得到查询总数。

    PageHelper.startPage静态方法调用【重点】

    //获取第1页,10条内容,默认查询总数
    count PageHelper.startPage(1, 10); 
    //紧跟着的第一个select方法会被分页
    List<Country> list = countryMapper.selectIf(1);
    
    • 在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。

3. 实战【权限系统】

  1. 导入PageHelper依赖

    <!--分页查询插件-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.2</version>
    </dependency>
    
  2. spring中配置文件配置

        <!--配置生产SqlSession的工厂-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <!--分页插件-->
            <property name="plugins">
                <array>
                    <!-- 传入插件的对象 -->
                    <bean class="com.github.pagehelper.PageInterceptor">
                        <property name="properties">
                            <props>
                                <prop key="helperDialect">mysql</prop>
                                <prop key="reasonable">true</prop>
                            </props>
                        </property>
                    </bean>
                </array>
            </property>
        </bean>
    
  3. service中使用PageHelper.startPage方法

    public List<Orders> findAllByPages(int start,int size) throws Exception{
            PageHelper.startPage(start,size);
            return ordersDao.findAll();
        }
    
    

    设置开始变化以及每页显示的大小

    start:开始位置

    size: 每页显示的条数

  4. controller中使用PageInfo封装返回结果

    @RequestMapping("/findAllByPage.do")
    public String findAllByPage(@RequestParam(required = true,value = "start",defaultValue = "1") int start,
                                @RequestParam(required = true,value = "size",defaultValue = "4") int size, Model model) throws Exception {
        List<Orders> all = ordersService.findAllByPages(start,size);
        PageInfo pageInfo = new PageInfo(all);
        model.addAttribute("pageInfo",pageInfo);
        return "orders-list";
    }
    
    

    此处将PageHelper根据查询的List结合传入的开始位置以及每页大小封装的PageInfo对象中,返回的到jsp页面中。

4. PageInfo

PageInfo对象封装了分页查询的诸多信息。包括查询到的对象集合,页面大小,总数等等。

PageInfo部分源码

public class PageInfo<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;

    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"

    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;

    //前一页
    private int prePage;
    //下一页
    private int nextPage;

    //是否为第一页
    private boolean isFirstPage = false;
    //是否为最后一页
    private boolean isLastPage = false;
    //是否有前一页
    private boolean hasPreviousPage = false;
    //是否有下一页
    private boolean hasNextPage = false;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    //导航条上的第一页
    private int navigateFirstPage;
    //导航条上的最后一页
    private int navigateLastPage;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值