# pageHelper

返回开源分支:java-实用工具

PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件

# 依赖

返回顶部

<dependency>
 <groupId>com.github.pagehelper</groupId>
 <artifactId>pagehelper</artifactId>
 <version>4.1.6</version>
</dependency>
1
2
3
4
5

PageHelper除了本身的jar包外,它还依赖了一个叫jsqlparser的jar包,使用时,我们不需要单独指定jsqlparser的maven依赖,maven的间接依赖会帮我们引入。

# 配置

返回顶部

<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
 <property name="dialect" value="mysql" />
 <!-- 该参数默认为false -->
 <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
 <!-- 和startPage中的pageNum效果一样 -->
 <property name="offsetAsPageNum" value="false" />
 <!-- 该参数默认为false -->
 <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
 <property name="rowBoundsWithCount" value="true" />

 <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
 <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型) <property name="pageSizeZero" value="true"/> -->

 <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
 <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
 <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
 <property name="reasonable" value="true" />
 <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
 <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
 <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
 <!-- 不理解该含义的前提下,不要随便复制该配置 <property name="params" value="pageNum=start;pageSize=limit;"/> -->
</plugin>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  • dialect:标识是哪一种数据库,设计上必须。
  • offsetAsPageNum:将RowBounds第一个参数offset当成pageNum页码使用,这就是上面说的一参两用,个人觉得完全没必要,offset = pageSize * pageNum就搞定了,何必混用参数呢?
  • rowBoundsWithCount:设置为true时,使用RowBounds分页会进行count查询,个人觉得完全没必要,实际开发中,每一个列表分页查询,都配备一个count数量查询即可。
  • reasonable:value=true时,pageNum小于1会查询第一页,如果pageNum大于pageSize会查询最后一页 ,个人认为,参数校验在进入Mybatis业务体系之前,就应该完成了,不可能到达Mybatis业务体系内参数还带有非法的值。

这么一来,我们只需要记住 dialect = mysql 一个参数即可,其实,还有下面几个相关参数可以配置。

  • autoDialect:true or false,是否自动检测dialect。
  • autoRuntimeDialect:true or false,多数据源时,是否自动检测dialect。
  • closeConn:true or false,检测完dialect后,是否关闭Connection连接。

上面这3个智能参数,不到万不得已,我们不应该在系统中使用,我们只需要一个dialect = mysql 或者 dialect = oracle就够了,如果系统中需要使用,还是得问问自己,是否真的非用不可。

# PageHelper的两种使用方式

返回顶部

  • 第一种、直接通过RowBounds参数完成分页查询 。
List<Student> list = studentMapper.find(new RowBounds(0, 10));
Page page = ((Page) list;
1
2
  • 第二种、PageHelper.startPage()静态方法
//获取第1页,10条内容,默认查询总数count
 PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
 List<Country> list = studentMapper.find();
 Page page = ((Page) list;
1
2
3
4
5

# PageHelper使用建议(性能最好)

  • 1、明确指定dialect。
  • 2、明确编写sql分页业务和与它对应的count查询,别图省事。

# 与springboot集成

返回顶部 | 返回:SpringBoot

# pom文件集成

<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.7</version>
</dependency>
1
2
3
4
5
6

# properties文件调整

#pageHelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
1
2
3
4
5

# 或者新建配置类(配置在类里支持热启动)

@Configuration
public class PageHelperConfig {

    /**
     - 注入pagehelper配置
     *
     - @return
     */
    @Bean
    public PageHelper getPageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "mysql");
        properties.setProperty("reasonable", "true");
        properties.setProperty("supportMethodsArguments", "true");
        properties.setProperty("params", "count=countSql");
        pageHelper.setProperties(properties);
        return pageHelper;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 直接使用

// service层直接使用,这是物理分页
@Override
public PageInfo<DeviceBo> getAllDevices(int currPage, int pageSize) {
    // TODO 自动生成的方法存根
    PageHelper.startPage(currPage, pageSize);
    //紧跟着的第一个select方法会被分页
    List<DeviceBo> bos = this.deviceMapper.getAllDevices();
    PageInfo<DeviceBo> pageInfo = new PageInfo<DeviceBo>(bos);
    //后面的不会被分页,除非再次调用PageHelper.startPage
List<Country> list2 = countryMapper.selectIf(null);
    return pageInfo;
}
1
2
3
4
5
6
7
8
9
10
11
12