上節(jié)課我們介紹了數(shù)據(jù)庫(kù)查詢時(shí),使用RowBounds進(jìn)行邏輯分頁(yè),但是存在一定的效率問題。這節(jié)課小博老師教大家使用攔截器實(shí)現(xiàn)一個(gè)物理分頁(yè)。
分頁(yè)攔截器的實(shí)現(xiàn)思路:
a)我們希望在原始查詢語(yǔ)句執(zhí)行前,對(duì)語(yǔ)句進(jìn)行變更,加上limit 0,10類似的語(yǔ)句。Mybatis在執(zhí)行Sql之前會(huì)產(chǎn)生Statement對(duì)象,所以我們可以在它生成Statement對(duì)象前對(duì)Sql語(yǔ)句改造。
b)在Mybatis中Statement語(yǔ)句是通過RoutingStatementHandler對(duì)象的prepare方法生成的。分頁(yè)攔截器的思路就是攔截StatementHandler接口的prepare方法,在攔截器方法中把Sql語(yǔ)句改造成分頁(yè)查詢Sql語(yǔ)句,然后再調(diào)用StatementHandler對(duì)象的prepare方法,也就是調(diào)用invocation.proceed()。
c)做分頁(yè)當(dāng)然需要先統(tǒng)計(jì)出記錄的總數(shù),然后計(jì)算出總共有多少頁(yè)。所以,在攔截器里面還需要統(tǒng)計(jì)滿足當(dāng)前查詢條件的記錄一共有多少。這就需要在獲取到原始的Sql語(yǔ)句后,修改為對(duì)應(yīng)的統(tǒng)計(jì)語(yǔ)句比如:select count(*) from tablename,之后再執(zhí)行該記錄統(tǒng)計(jì)的Sql語(yǔ)句進(jìn)行總記錄數(shù)的查詢。