博為峰JavaEE技術(shù)文章 ——MyBatis 攔截器(3)分頁(yè)

上節(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ù)的查詢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容