項目中使用了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'