# PageHelper 分页插件

### 分页查询

假设数据表很大，你需要将数据库分成N页, 一页10条数据，你需要查询第100页的10条数据。如果直接写死在 SQL 语句中则会很死板，而且扩展性不强。

这时候如果有一个分页的插件， 可以按照预定的分页规则，一页多少条数据，查询第几页，那么就会非常方便。[ PageHelpe](https://pagehelper.github.io/)r 就是这样一个插件。

### Maven 中添加依赖

在 pom.xml 中添加下面两个标签：

```xml
    <!-- page helper 插件       -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.10</version>
    </dependency>

    <dependency>
        <groupId>com.github.jsqlparser</groupId>
        <artifactId>jsqlparser</artifactId>
        <version>2.0</version>
    </dependency>
```

### mybatis-config.xml 下增加 plugin 配置

D:\intro\_Java\MyBatis\src\main\resources\mybatis-config.xml 下增加 \<plugin> 标签：

```xml
    <!-- pagehelper 插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 设置数据库类型 -->
            <property name="helperDialect" value="mysql"/>
            <!-- 分页合理化 -->
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>
```

### goods.xml 增加一个测试标签

D:\intro\_Java\MyBatis\src\main\resources\mappers\goods.xml中增加下面这个标签:&#x20;

```xml
    <select id="selectPage" resultType="indi.chester.mybatis.entity.Goods" >
        SELECT  * FROM  babytun.t_goods WHERE current_price &lt; 1000
    </select>
```

### 调用 PageHelper

&#x20;MyBatis\src\test\java\MyBatisTest.java 中添加下面这个测试方法:&#x20;

```java
    @Test
    public void testPageHelper () throws Exception{
        SqlSession sqlSession=null;
        try {
            sqlSession=MyBatisUtils.openSession();
            //查询第二页,每一页有10条数据
            PageHelper.startPage(2,10);
            Page<Goods> page = (Page) sqlSession.selectList("goods.selectPage");
            System.out.println("总页数 : "+page.getPages());
            System.out.println("总记录数 : "+page.getTotal());
            System.out.println("开始行号 : "+page.getStartRow());
            System.out.println("结束行号 : "+page.getEndRow());
            System.out.println("当前页码 : "+page.getPageNum());
            List<Goods> pageData = page.getResult();//当前页数据
            for (Goods g : pageData){
                System.out.println(g.getTitle());
            }
        }catch (Exception e){
            e.printStackTrace();
            throw e;
        }finally {
            MyBatisUtils.closeSession(sqlSession);
        }

    }
```

运行结果:&#x20;

```
16:01:35:367 [main]  DEBUG goods.selectPage_COUNT -==>  Preparing: SELECT count(0) FROM babytun.t_goods WHERE current_price < 1000  
16:01:35:397 [main]  DEBUG goods.selectPage_COUNT -==> Parameters:  
16:01:35:436 [main]  DEBUG goods.selectPage_COUNT -<==      Total: 1 
16:01:35:443 [main]  DEBUG goods -Cache Hit Ratio [goods]: 0.0 
16:01:35:443 [main]  DEBUG goods.selectPage -==>  Preparing: SELECT * FROM babytun.t_goods WHERE current_price < 1000 LIMIT ?, ?  
16:01:35:444 [main]  DEBUG goods.selectPage -==> Parameters: 10(Integer), 10(Integer) 
16:01:35:449 [main]  DEBUG goods.selectPage -<==      Total: 10 
总页数 : 181
总记录数 : 1808
开始行号 : 10
结束行号 : 20
当前页码 : 2
兰多 升级版时尚妈咪包 桔色
康泰 家用智能胎心仪 分体探头操作方便 外放聆听 与家人分享宝宝心声
惠氏 启赋（Wyeth illuma）有机1段 900g （0-6月）婴儿配方奶粉（罐装）
惠氏 启赋（Wyeth illuma）有机2段900g（6-12月）较大婴儿配方奶粉（罐装）
惠氏启赋3段（12-36个月）幼儿配方奶粉900g *2罐
爱他美婴幼儿配方奶粉pre段800g 铂金版
【日本】尤妮佳MOONY 纸尿裤S84*3包
【日本】日本Moony XL38(男)拉拉裤*4包
【日本】Moony尤妮佳婴儿拉拉裤(男)L44片*3包
【日本】Moony尤妮佳婴儿裤型拉拉裤(女)L44*3包
```
