pagehelper计算总条数原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

pagehelper计算总条数原理
PageHelper是Mybatis中分页插件,可以方便地对查询结果进行分页,对于查询语句结果过多时,可以提高查询效率并减轻数据库的压力,此外,PageHelper自带了计算总条数的功能,本文将围绕此功能展开。

1.创建Page对象
Page是PageHelper中用来存储分页信息的对象,我们需要首先创建一个新的Page对象,例如:
```java
Page<Object> page = PageHelper.startPage(1, 10);
```
其中1表示当前页码,10表示每页显示的数据条数,这句话的含义是从第1页开始,每页显示10条数据。

2.执行查询语句
接着,我们需要执行我们的查询语句,例如:
```java
List<Student> studentList =
studentMapper.selectByExample(example);
```
这句话的含义是通过Example对象example来执行查询语句,将查询结果存储在studentList中。

3.获取总条数
最后一步,我们需要通过Page对象来获取总条数,例如:
```java
long total = page.getTotal();
```
其中,getTotal()方法会返回查询结果的总条数。

那么,PageHelper是如何实现计算总条数的呢?
在上述三个步骤中,我们可以发现,PageHelper主要存储了以下信息:
- 当前页码
- 每页显示的数据条数
- 查询条件
- 排序规则
其中,前三个信息是分页相关的,而查询条件和排序规则是与分页无关的。

PageHelper会首先根据查询条件和排序规则执行实际的查询语句,获取查询结果的总条数,将其存储在Page对象中,然后再根据当前页码和每页显示的数据条数来获取当前页的数据。

以获取总条数为例,PageHelper中的方法调用顺序如下:
```java
public <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {
this.pageSize = pageSize;
this.pageNum = pageNum;
this.count = count;
if (count) {
if (reasonable == null) {
// null时,会设置为默认值
// 10w条以内,执行count查询数量,超过10w条数据时,不再执行count查询数量,建议自行处理分页合理性。

if (pageSize <= 0 || pageSize >= 10000) {
this.reasonable = Boolean.FALSE;
} else {
this.reasonable = Boolean.TRUE;
}
}
if (reasonable != null && reasonable) {
// 生成count查询的sql
this.countSqlParser = new
SqlParser(configuration, countSql)
.parse(configuration.getInterceptors( ));
// count查询的参数集合
this.countParameterObject = copyParameterObject(parameterObject, boundSql);
}
}
}
```
该方法用来开始一个分页操作,其中count参数表示是否需要计算总条数,如果count为true,则需要计算总条数,否则不需要。

当count为true时,在方法中会进行一系列操作,包括根据当前页码和每页显示的数据条数生成limit子句(用于返回当前页的数据),生成count查询的sql(用于计算总条数),将查询条件和查询参数存储到Page对象中。

接着,PageHelper将生成的count查询的sql和参数传递给Mybatis的SqlSessionFactory对象,并通过它来获取一个新的SqlSession对象。

```java
SqlSession sqlSession =
sqlSessionTemplate.getSqlSessionFactory().openSession();
```
然后,PageHelper将生成的count查询的sql和参数对象传递给SqlSession对象,并通过SqlSession对象来执行count查询。

```java
PreparedStatement countStmt = null;
ResultSet rs = null;
try {
countStmt = connection.prepareStatement(countSql);
BoundSql countBS = fillParameters(countStmt,
mappedStatement, countBoundSql, countParameterObject);
rs = countStmt.executeQuery();
if (rs.next()) {
count = rs.getLong(1);
}
}
```
在执行count查询时,PageHelper会先将count查询的参数对象进行克隆,并更新其offset和limit两个参数(PageHelper中用$符号来标记offset和limit两个参数,在这里通过正则表达式来寻找并替换),最后将更新后的count查询的参数对象传递给SqlSession对象来执行查询。

执行完count查询后,PageHelper会将查询结果的总条数存储在Page对象中,并返回该对象,此时,我们通过调用Page对象的getTotal()方法就可以获取到查询结果的总条数了。

综上所述,PageHelper根据当前页码和每页显示的数据条数生成分页相关的信息(包括limit子句和总条数),然后将查询条件和分页相关信息传递给Mybatis的SqlSessionFactory对象,通过SqlSession对象来执行实际的查询操作,最后将查询结果存储在Page 对象中,这就是PageHelper计算总条数的原理。

相关文档
最新文档