mybatis分頁外掛程式

2021-09-14 05:38:33 字數 2542 閱讀 3001

其實吧,這個分頁的封裝是我從mybatis實戰上抄的,然後又重構了下**,形成了自己的。現在之所以會記錄一下,主要原因是出現了質變———對foreach的支援,而解決這個問題的過程中,我感覺,應該基本上使用上沒有多少侷限行了。下面說說實際的吧。

基本的設計思路,是使用mybatis外掛程式,首先是下面這一串註解:

@intercepts()})

public class pageinterceptor implements interceptor

// 分離最後乙個**物件的目標類

while (metastatementhandler.hasgetter("target"))

//獲取selectid

int count = 0;

// 如果以指定詞結尾則處理

if (selectid.endswith(this.endword))

object result = invocation.proceed();

return result;

前面的一大截都是獲取對應的statement,然後就是獲取selectid,然後是判斷selectid是不是要攔截的,如果是,就先進行一次count,再查詢資料。gettotal方法就是獲取總條數的方法,返回值就是總條數,會直接塞到入參裡,具體**如下:

private int gettotal(invocation ivt, metaobject metastatementhandler, boundsql boundsql) throws sqlexception, nosuchfieldexception, illegalacces***ception 

//將原來的additionalparameters複製到新的countboundsql中

field additionalparametersfield = reflectutil.getfieldbyfieldname(countboundsql, "additionalparameters");

if (additionalparametersfield != null)

//構建mybatis的parameterhandler用來設定總數sql引數

//設定總數sql引數

handler.setparameters(ps);

//執行查詢

resultset rs = ps.executequery();

while (rs.next())

} finally

return total;

}

這個方法比較長,實際的基本思路是,獲得原來的sql,拼接count sql,再用就的bound構造新的bound,再執行新的查詢。之前一直無法使用foreach標籤,關鍵點在於

//將原來的metaparameters複製到新的countboundsql中

field metaparamsfield = reflectutil.getfieldbyfieldname(countboundsql, "metaparameters");

if (metaparamsfield != null)

//將原來的additionalparameters複製到新的countboundsql中

field additionalparametersfield = reflectutil.getfieldbyfieldname(countboundsql, "additionalparameters");

if (additionalparametersfield != null)

這四行將構造新bound沒帶過來,但是執行這些繫結又必須的東西帶過來了,然後,才匹配上了。最後我們看看getlimiteddata

private object getlimiteddata(invocation invocation, metaobject metastatementhandler, boundsql boundsql, map param) throws invocationtargetexception, illegalacces***ception 

//修改當前需要執行的sql

metastatementhandler.setvalue("delegate.boundsql.sql", sql);

//相當於呼叫statementehandler的prepare方法,預編譯了當前sql,並設定原有的引數,但是少了兩個分頁引數,它返回的是乙個preparedstatement物件

preparedstatement ps = (preparedstatement) invocation.proceed();

return ps;

}

其實很簡單,就是改了下sql,然後執行查詢返回。

雖然現在遇見的問題都解決了,但是很可能我的實現還是有問題的,因為interceptor提供要重寫的方法不止這乙個,而我還不知道其它的都幹什麼用,後面慢慢研究吧。

外掛程式寫出來了,就要想想怎麼生效

好了,打完收工,後面整理出來具體的例子再詳細維護吧,這裡已經基本說完了這個外掛程式的關鍵實現了。

mybatis 分頁外掛程式

pagehelper 是國內非常優秀的一款開源的mybatis分頁外掛程式 支援任何複雜的單錶 多表分頁。它支援基本主流與常用的資料庫,例如mysql oracle db2 sqlite hsqldb等。本文主要使用的是mysql和pagehelper方法的呼叫 使用pagehelper之後我們就可...

Mybatis分頁外掛程式 PageHelper

如果你也在用mybatis,建議嘗試該分頁外掛程式,這個一定是最方便使用的分頁外掛程式。該外掛程式目前支援oracle,mysql,mariadb,sqlite,hsqldb,postgresql六種資料庫分頁。第一步 在mybatis配置 xml中配置 外掛程式 1 2 3 4 5 6 7 第二步...

Mybatis分頁外掛程式 PageHelper

如果你也在用mybatis,建議嘗試該分頁外掛程式,這個一定是最方便使用的分頁外掛程式。該外掛程式目前支援oracle,mysql,mariadb,sqlite,hsqldb,postgresql六種資料庫分頁。第一步 在mybatis配置 xml中配置 外掛程式 123 4567 第二步 在 中使...