mybatis學習筆記三之mybatis外掛程式

2021-10-10 06:26:36 字數 4262 閱讀 4658

一、外掛程式介紹

一般情況下,開源框架都會提供外掛程式或其他形式的擴充套件點,供開發者自行擴充套件。一是增加了框架的靈活性、二是開發者可以結合實際需求,對框架進行擴充套件。以mybatis為例,我們可基於mybatis外掛程式機制實現分頁、分表、監控等功能,在無形中增強功能。

二、mybatis外掛程式

mybatis框架具有強大的靈活性,在四大元件(executor、statementhandler、parameterhandler、resultsethandler)處提供了簡單易用的外掛程式擴充套件機制。mybatis對持久層的操作就是借助於四大核心物件。mybatis支援用外掛程式對四大核心物件進行攔截,對mybatis來說外掛程式就是***,用來增強核心物件的功能,增強功能的本質上是借助於底層的動態**實現的。換句話說,mybatis的四大物件都是**物件。

(1)mybatis所允許攔截的方法如下:

executor(執行器,用來執行sql):update、query、commit、rollback等方法

statementhandle(sql語法構建器,預編譯sql):prepare、parameterize、batch、update、query等方法

parameterhandle(引數處理器):getparameterobject、setparameters等方法

resultsethandle(結果集處理器):handleresultsets、handleoutputparameters等方法

(2)外掛程式具體是如何攔截並附加額外的功能的呢?以parameterhandle為例

object object, boundsql sql, interceptorchain interceptorchain)

public object pluginall(object target)

return target;}

①當我們在建立parameterhandle物件時,不是直接返回的,二是呼叫了interceptorchain.pluginall(parameterhandler)方法,該方法會獲取到所有的***(interceptor,所有外掛程式都要實現該介面)。

②mybatis初始化時會建立interceptorchain(***鏈),儲存了所有interceptor(***),我們再呼叫***鏈中的***interceptor.plugin(target);返回target包裝後的物件(**物件),為目標物件增強。

外掛程式機制:我們可以使用外掛程式(***)為目標物件建立乙個**物件,我們的外掛程式可以為mybatis四大物件建立**物件(用的就是jdk動態**),

我們都知道jdk動態**:為介面生成**物件時要實現invocationhandler()介面,並重寫invoke方法。**物件呼叫介面中任一方法,走invoke邏輯,這樣我們可以在重寫的invoke方法中增強我們的功能。

(3)自定義外掛程式

第一步:外掛程式類都要去實現mybatis外掛程式介面-interceptor,並重寫裡面三個方法,這裡自定義乙個myplugin:

@intercepts()

})public class myplugin implements interceptor

/*主要為目標物件建立乙個**物件進行返回

*/@override

public object plugin(object target)

/*獲取配置檔案的引數

*/@override

public void setproperties(properties properties)

}

我們可以看到這三個方法的作用:

object  intercept(invocation invocation):攔截方法:只要被攔截的目標物件的目標方法被執行時,每次都會執行intercept方法

object plugin(object target):主要為了把當前的***生成**存到***鏈中

void setproperties(properties properties):獲取配置檔案的引數

註解配置:表示攔截statementhandler類中prepare方法,因為有方法的過載,所以還需指定prepare方法引數args

@intercepts()

})第二步:我們需要在核心配置檔案sqlmapconfig.xml中配置外掛程式:

listselectuser();}

id,username

from

user

第三步:測試

public class plugintest 

}}

我們在執行任何一條sql之前,肯定會呼叫statementhandler類中prepare方法對sql進行預編譯。我們對這三個方法打斷點除錯可以發現:

依次執行順序是:①先獲取了配置檔案引數②把我們自定義***myplugin存到***鏈中使其生效③攔截方法

三、原始碼分析

我們從mybatis的外掛程式類plugin為入口

這個類實現了invocationhandler()介面,這個介面就是jdk動態**中用到的,所以要重寫invoke()方法:

首先我們要知道,mybatis四大核心物件在返回時都是返回了**物件,當**物件在執行方法時都是要去執行invoke方法的,我們可以看到上面invoke()方法邏輯,

這裡呼叫的就是***interceptor中的 object intercept(invocation invocation)實現功能增強。

至此,我們總結一下:mybatis外掛程式就是乙個***,***都要去實現interceptor介面並重寫裡面的三個方法,我們可以通過註解配置我們需要攔截哪個類中的哪個方法,當在執行目標方法時,會先執行***的     

@override

public object plugin(object target)

而plugin類又去實現了invocationhandler()介面並重寫了invoke方法,invoke()方法中會獲取所有被攔截的方法,再呼叫interceptor(***)中的object intercept(invocation invocation)方法實現增強。

四、pagehelper分頁外掛程式

mybatis可以使用第三方的外掛程式來對功能進行擴充套件,分頁外掛程式pagehelper是將分頁的複雜操作進行封裝,使用簡單的方式即可獲取分頁相關資料。

(1)引入座標並配置外掛程式

com.github.pagehelper

pagehelper

3.7.5

(2)**測試

@test

public void testpagehelper()

//其他分頁資料

pageinfopageinfo = new pageinfo(select);

system.out.println("總跳數"+pageinfo.gettotal());

system.out.println("總頁數"+pageinfo.getpages());

system.out.println("當前頁"+pageinfo.getpagenum());

system.out.println("每頁顯示條數"+pageinfo.getpagesize());

system.out.println("是否第一頁"+pageinfo.isisfirstpage());

system.out.println("是否最後一頁"+pageinfo.isislastpage());

}

學習筆記之mybatis 二

的開發方法。需要傳入配置檔案中的標籤方法。很不方便。需要通過介面 的方法便可去除sql方法標籤 1.先建立乙個介面,實現的方法為所有想要實現的功能的方法 3.實現乙個繼承方法介面的類。以乙個查詢方法來實現 select from mb test where id 4.再實現類中的方法沒什麼不同 建立...

mybatis學習筆記

隨便寫點,先把文章建立了,然後再新增內容。一 最重要的介面類 sqlsessionfactory,從類名上我認為這是乙個工廠類,用來建立sqlsession的例項。同乙個資料庫的連線或資料來源的訪問,可以用同乙個sqlsessionfactory來建立。二 乙個工具類,sqlsessionfacto...

mybatis學習筆記

mybatis的resultmap與resultclass 1 resultmap屬於直接對映,可以把結果集中的資料庫欄位與實體類中的屬性一一對應,這樣通過select語句得到的結果就會準確的對上號 2 resultclass屬於隱身對映,雖然你指定resultclass 具體某乙個類,但是sele...