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