
mybatis支持配置插件實(shí)現(xiàn)自定義的功能增強(qiáng)。默認(rèn)情況下MyBatis 允許使用插件來攔截的方法調(diào)用包括Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSets, handleOutputParameters)StatementHandler (prepare, parameterize, batch, update, query)若配置了插件構(gòu)建時(shí)則生成對應(yīng)的代理類從而實(shí)現(xiàn)功能增強(qiáng)。PageHelper分頁插件PageHelper通過攔截Executor的query方法實(shí)現(xiàn)對查詢方法的增強(qiáng)(查詢總數(shù)、添加分頁參數(shù)等)支持分頁查詢。使用步驟1、導(dǎo)入PageHelper包2、mybatis配置文件中指定插件類3、業(yè)務(wù)代碼執(zhí)行查詢前指定分頁參數(shù)插件執(zhí)行流程插件都是通過JDK動(dòng)態(tài)代理生成攔截對象的代理類實(shí)現(xiàn)的。以PageHelper為例核心類為PageInterceptor該攔截器實(shí)現(xiàn)了mybatis的Interceptor接口mybatis源碼中預(yù)留了執(zhí)行插件增強(qiáng)的邏輯若有插件則生成對應(yīng)類的代理從而對目標(biāo)方法進(jìn)行增強(qiáng)。因?yàn)榕渲梦募信渲昧薖ageInterceptor所以在生成config對象時(shí)InterceptorChain會(huì)添加對應(yīng)的攔截器。創(chuàng)建sqlsession時(shí)會(huì)創(chuàng)建執(zhí)行器Executor,若是存在攔截器將會(huì)生成對應(yīng)執(zhí)行器的動(dòng)態(tài)代理類。因?yàn)閑xecutor是代理對象所以執(zhí)行方法時(shí)會(huì)執(zhí)行相應(yīng)的增強(qiáng)邏輯。Executor中涉及很多方法哪些方法要執(zhí)行攔截增強(qiáng)是通過攔截器中的Signature標(biāo)簽指定。類名、方法名及形參列表都要匹配才會(huì)攔截。當(dāng)執(zhí)行目標(biāo)方法時(shí)最終會(huì)來到intercept執(zhí)行增強(qiáng)邏輯。查詢總數(shù)拼接sql業(yè)務(wù)代碼中設(shè)置的分頁參數(shù)會(huì)存儲(chǔ)到ThreadLocal中處理分頁參數(shù)時(shí)會(huì)從ThreadLocal取。