PageHelper分页插件使用过程中的问题

项目中使用了Mybatis加PageHelper插件实现分页查询功能。空闲时间研究了一下这个插件的使用。

只有紧跟在 PageHelper.startPage 方法后的第一个 Mybatis 的查询(Select)方法会被分页。

也就是当分页查询是,设置完pageSize和pageNum后的第一个sql查询语句才会实现分页查询功能,再后面的不会被实现。

不支持一对一和一对多结果映射的分页查询

在一对一和一对多时,根据分页条件查询出 100 条数据时,由于一对一和一对多会去重,经过嵌套处理后数据量会减少,因此分页想要获得 100 条数据无法实现。想要支持这种情况可以使用嵌套查询。嵌套查询是要额外执行SQL,主SQL可以得到正确的结果数量,因此可以正常分页。

 

当表记录达到数十万上百万时 ,越往后的页面(也就是偏移量越大时)分页查询越慢。

这个问题的直接原因是全表扫描到偏移量的位置这个过程耗时,这时候就需要自己单独做处理了,例如 使用查询ID一个字段的子查询sql来定位到偏移量的位置 实现优化分页性能(如果要集成到插件中需要重写MySqlDialect这个类对插件源码进行修改

select * from orders where status='1' and  ID>(select ID from orders where status='1' limit 100000,1)limit 0,100

 分页功能中执行count查询时很耗时

这个问题我们可以自定义查询sql来进行优化(插件支持自定义count语句) ,例如我们的要分页的sql是

<select id="getCoustomerList" parameterType="com.activity.center.dto.manage.ActivityClientStatisResDTO" resultType="com.activity.center.dto.manage.ActivityClientStatisResDTO">
        SELECT * from activity_info where user_type = 0
        <if test="clientName != null and clientName !=''">
            AND NAME like '%${clientName}%'
        </if>
    </select>

按照PageHelper自定义count查询的规则,我们新建一个select标签,id的名称定义成  getCoustomerList_count 这个名字,就可以在查询时使用自己定义的这个count查询了。count查询id的定义格式就是 查询sql标签的id+'_count' 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章