一、概述
PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。
本文主要记录该插件的非常规用法,其中包括自定义COUNT查询语句,COUNT查询优化等。
二、场景示例
PageHelper默认情况下会帮我们根据查询语句自动生成COUNT查询SQL,但是有些情况下,PageHelper自动生成COUNT查询SQL存在效率问题。比如,其中使用了GROUP BY
语句。生成的COUNT查询SQL查询效率很慢。
PageHelper自动生成的SQL
-- 查询SQL
SELECT
a.field
FROM
page_view_statistics a
GROUP BY
a.field
ORDER BY
view_count DESC
LIMIT 20
-- 自动生成的COUNT查询SQL
SELECT
count( 0 )
FROM
(
SELECT
a.field
FROM
page_view_statistics a
GROUP BY
a.field
) table_count
上述由PageHelper插件自动生成的COUNT查询SQL,由于进行了一层嵌套,并且SQL中也加入了GROUP BY
语句,导致查询效率很慢。
因此我们需要自定义COUNT查询SQL,不要用插件自动生成的SQL。
三、自定义COUNT查询SQL
PageHelper插件允许我们自定义COUNT查询SQL,定义方法就是,新增一个select查询语句,查询对应COUNT,查询标签的ID命名为原来的查询语句标签ID
+ _COUNT
。示例如下。
自定义COUNT查询SQL示例
<!-- 查询SQL -->
<select id="findListGroupContentId" parameterType="PageViewStatistics" resultMap="qpResult">
SELECT
a.field
FROM
page_view_statistics a
GROUP BY
a.field
</select>
<!-- 自定义COUNT查询SQL -->
<select id="findListGroupContentId_COUNT" parameterType="PageViewStatistics" resultType="Long">
SELECT
count(DISTINCT a.field )
FROM
page_view_statistics a
</select>
根据上述方法定义之后,PageHelper插件就会根据我们自定义的COUNT查询SQL进行分页总数的查询了。
四、PageHelper.count()方法的使用
很多业务场景下,我们需要单独进行COUNT查询,这种情况下,如果在Mapper文件里面再单独写一个查询方法,会显得代码很冗余,方法复用性不高。
PageHelper插件提供了只执行COUNT查询的方法。示例如下。
PageHelper.count()使用示例
// Mapper层接口, 对应上面的SQL
List<Entity> findListGroupContentId(Entity entity);
// 单独执行COUNT查询
PageHelper.count(() -> findListGroupContentId(entity));
五、PageHelper.orderBy()方法的使用
同理,除了需要进行单独COUNT查询之外,我们有时也需要对SQL查询的数据进行排序。
PageHelper.orderBy方法可以帮我们把排序的功能从Mapper文件中分离出来。
PageHelper.orderBy()使用示例
// 直接调用即可,传入需要排序的字段,也可以跟分页一起用。
PageHelper.orderBy("sort asc");
六、分页不执行count
如果我们需要查询特定几条数据,但是又不希望分页前执行count查询语句,可以按照如下方法操作即可。
只分页示例
// 将count设置成false即可
Page<Entity> temp = PageHelper.startPage(1, 1, false);