mybatis支持配置插件,实现自定义的功能增强。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
若配置了插件,构建时则生成对应的代理类,从而实现功能增强。
PageHelper分页插件
PageHelper通过拦截Executor的query方法实现对查询方法的增强(查询总数、添加分页参数等),支持分页查询。
使用步骤:
1、导入PageHelper包
2、mybatis配置文件中指定插件类
3、业务代码执行查询前指定分页参数
插件执行流程
插件都是通过JDK动态代理生成拦截对象的代理类实现的。以PageHelper为例,核心类为:PageInterceptor,该拦截器实现了mybatis的Interceptor接口,mybatis源码中预留了执行插件增强的逻辑,若有插件则生成对应类的代理从而对目标方法进行增强。
因为配置文件中配置了PageInterceptor,所以在生成config对象时InterceptorChain会添加对应的拦截器。
创建sqlsession时会创建执行器Executor,若是存在拦截器,将会生成对应执行器的动态代理类。
因为executor是代理对象,所以执行方法时会执行相应的增强逻辑。
Executor中涉及很多方法,哪些方法要执行拦截增强是通过拦截器中的
@Signature标签指定。类名、方法名及形参列表都要匹配才会拦截。
当执行目标方法时最终会来到intercept执行增强逻辑。
查询总数
拼接sql
业务代码中设置的分页参数会存储到ThreadLocal中,处理分页参数时会从ThreadLocal取。