mybatis 4大核心对象

188 阅读2分钟

mybatis 4大核心对象

  • Executor

    执⾏器Executor (update、query、commit、rollback等⽅法)

  • StatementHandler

    SQL语法构建器StatementHandler (prepare、parameterize、batch、updates query等⽅ 法)

  • ParameterHandler

    参数处理器ParameterHandler (getParameterObject、setParameters⽅法)

  • ResultSetHandler

    结果集处理器ResultSetHandler (handleResultSets、handleOutputParameters等⽅法)

mybatis 插件原理

在四⼤对象创建的时候

  • 每个创建出来的对象不是直接返回的,⽽是interceptorChain.pluginAll(parameterHandler)
  • 获取到所有的 Interceptor (拦截器)(插件需要实现的接⼝),调⽤ interceptor.plugin(target),返回 target 包装后的对象
  • 插件机制,我们可以使⽤插件为⽬标对象创建⼀个代理对象。AOP (⾯向切⾯)我们的插件可以为四⼤对象创建出代理对象,代理对象就可以拦截到四⼤对象的每⼀个执⾏

mybatis 自定义插件

  • 编写实现类
Intercepts (
{
    // 注意看这个⼤花括号,也就这说这⾥可以定义多个@Signature对多个地⽅拦截,都⽤这个拦截器
    @Signature (type = StatementHandler.class, // 这是指拦截哪个接⼝
        method = "prepare"// 这个接⼝内的哪个⽅法名,不要拼错了
        args = { Connection.class, Integer.class}), // 这是拦截的⽅法的⼊参,按顺序写到这,不要多也不要少,如果⽅法重载,可是要通过⽅法名和⼊参来确定唯⼀的
})
public class MyPlugin implements Interceptor {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    // 这⾥是每次执⾏操作的时候,都会进⾏这个拦截器的⽅法内
    Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 增强逻辑
        System.out.println("对⽅法进⾏了增强....");
        // 执⾏原⽅法
        return invocation.proceed(); 
    }

    /**
     * 主要是为了把这个拦截器⽣成⼀个代理放到拦截器链中
     * 包装⽬标对象 为⽬标对象创建代理对象
     * @Param target 要拦截的对象
     * @Return 代理对象
     */
    Override
    public Object plugin(Object target) {
        System.out.println("将要包装的⽬标对象:"+target);
        return Plugin.wrap(target,this);
    }

    /**
     * 获取配置⽂件的属性
     * 插件初始化的时候调⽤,也只调⽤⼀次,插件配置的属性从这⾥设置进来
     * @Param target properties
     */
    Override
    public void setProperties(Properties properties) {
        System.out.println("插件配置的初始化参数:"+properties );
    }
}
  • 注册插件
<plugins>
    <plugin interceptor="xxx.MySqlPagingPlugin">
        <!--配置参数-->
        <property name="name" value="Bob"/>
    </plugin>
</plugins>