`

mybatis Executor插件加载源码

 
阅读更多
//插件扩展实现类:
org.apache.ibatis.session.Configuration
//具体方法:
protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;  
public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
    executorType = executorType == null ? defaultExecutorType : executorType;
    executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
    Executor executor;
    if (ExecutorType.BATCH == executorType) {
      executor = new BatchExecutor(this, transaction);
    } else if (ExecutorType.REUSE == executorType) {
      executor = new ReuseExecutor(this, transaction);
    } else {
      executor = new SimpleExecutor(this, transaction);
    }
    if (cacheEnabled) {
      executor = new CachingExecutor(executor);
    }
    executor = (Executor) interceptorChain.pluginAll(executor);
    return executor;
  }

    Executor接口:

public interface Executor {

  ResultHandler NO_RESULT_HANDLER = null;

  int update(MappedStatement ms, Object parameter) throws SQLException;

  List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException;

  List<BatchResult> flushStatements() throws SQLException;

  void commit(boolean required) throws SQLException;

  void rollback(boolean required) throws SQLException;

  CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds);

  boolean isCached(MappedStatement ms, CacheKey key);

  void clearLocalCache();

  void deferLoad(MappedStatement ms, MetaObject resultObject, String property, CacheKey key);

  Transaction getTransaction();

  void close(boolean forceRollback);
  
  boolean isClosed();

}

 

 

插件继承和扩展:

implements Interceptor

  

   

@Intercepts( { @Signature(type = Executor.class, method = "query", args = {
		MappedStatement.class, Object.class, RowBounds.class,
		ResultHandler.class }) })

 

 

具体实例:

package com.xuanwu.sms.smstask.webmanager.common.crud.plugins;

import java.lang.reflect.Field;
import java.util.Properties;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
@Intercepts( { @Signature(type = Executor.class, method = "query", args = {
		MappedStatement.class, Object.class, RowBounds.class,
		ResultHandler.class }) })
public class PaginationInterceptor implements Interceptor {

	public Object intercept(Invocation invocation) throws Throwable {

		MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
		Object parameter = invocation.getArgs()[1];
		mappedStatement.getSqlSource().getBoundSql(parameter);
		BoundSql boundSql = mappedStatement.getBoundSql(parameter);

		if (boundSql == null || boundSql.getSql() == null || "".equals(boundSql.getSql())) {
			return null;
		}
		
		String newSql = "select * from (" + boundSql.getSql() + ") t";
		
		Class<?> cla =boundSql.getClass();
		Field field = cla.getDeclaredField("sql");
		field.setAccessible(true);
		field.set(boundSql, newSql);
		String test = boundSql.getSql();
		
		return invocation.proceed();
	}

	public Object plugin(Object target) {
		return Plugin.wrap(target, this);
	}

	public void setProperties(Properties properties) {
		String dialectClass = properties.getProperty("dialectClass");
		try {
			Object dialect = (Object) Class.forName(dialectClass).newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}

}

 

 

 

分享到:
评论

相关推荐

    mybatis-3-mybatis-3.4.1源码

    7. **Plugins**:MyBatis的插件机制,可以通过拦截器对Executor、StatementHandler、ParameterHandler和ResultSetHandler进行增强。 8. **MapperRegistry**:负责管理所有的Mapper接口和它们对应的XML配置。 9. **...

    mybatis-3.4.1源码

    11. **插件机制**: MyBatis支持自定义插件,可以通过实现Interceptor接口,对Executor、StatementHandler、ParameterHandler和ResultSetHandler进行拦截,实现AOP功能,如性能监控、日志记录等。 12. **事务管理**:...

    mybatis3 源码

    MyBatis提供了一种插件机制,允许用户自定义拦截器来拦截Executor、StatementHandler、ParameterHandler和ResultSetHandler的行为。通过源码,我们可以看到如何实现和注册这些插件。 通过对MyBatis3源码的深入研究...

    Mybatis源码可直接导入eclipse

    Mybatis 的源码对于学习和理解其工作原理、优化数据库操作以及自定义功能非常有帮助。本篇文章将深入探讨如何将Mybatis的源码导入Eclipse,并利用Eclipse的强大功能进行学习和调试。 首先,我们需要下载Mybatis的...

    《MyBatis 基础笔记》源代码

    以上内容只是MyBatis基础部分的概述,实际使用中,MyBatis还有更多高级特性和最佳实践,如结果映射的复杂性、延迟加载、插件机制等,都需要深入学习和理解。通过阅读《MyBatis 基础笔记》的源代码,你可以更深入地...

    mybatis源码

    5. **插件机制**: MyBatis允许用户自定义插件,可以拦截Executor、StatementHandler、ParameterHandler和ResultSetHandler四个接口的方法,实现自定义的功能,如性能监控。 6. **参数绑定**: MyBatis通过...

    mybatis-3-mybatis-3.4.5.rar

    11. **延迟加载(Lazy Loading)**:MyBatis提供了延迟加载机制,当需要关联的对象时,才真正去数据库加载数据,提高性能。 12. **缓存(Cache)**:MyBatis内置了两级缓存,一级缓存是SqlSession级别的,二级缓存...

    MyBatis学习(四)源码下载

    1. **初始化过程**:了解MyBatis的初始化流程,包括SqlSessionFactoryBuilder的创建、SqlSessionFactory的构建,以及Configuration类中加载XML配置文件的过程。 2. **SQL执行**:研究Executor接口及其实现,如...

    mybatis源码+练习代码+手写练习

    同时,插件的应用(如PageHelper分页插件)也会在这个文件夹中体现,它展示了如何自定义拦截器来增强MyBatis的功能。 手写MyBatis的练习是提升对MyBatis理解的好方法。首先,你需要理解MyBatis的主要功能,如动态...

    Mybatis-3完整版源代码java-source-code

    这个资源" Mybatis-3 完整版源代码 java-source-code"包含了 Mybatis 3.x 版本的核心源码,这对于深入理解其工作原理、学习如何自定义拦截器、插件以及优化 SQL 查询非常有帮助。 首先,我们来探讨一下 Mybatis 的...

    MyBatis的27道面试题

    MyBatis的插件运行原理是基于拦截器机制,插件可以拦截四大对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)的方法。编写一个插件需要实现Interceptor接口,并使用@Intercepts注解来标记...

    一本小小的MyBatis源码分析书.rar

    MyBatis提供插件机制,可以通过实现`Interceptor`接口创建插件,对Executor、StatementHandler、ParameterHandler、ResultSetHandler四个接口的方法进行拦截,实现自定义功能,如日志记录、性能监控等。 通过对...

    MyBatis3.5.15源码阅读注释

    5. **Executor**:执行器是 MyBatis 执行 SQL 的核心,分为 SimpleExecutor、ReusedExecutor 和 BatchExecutor。它们分别对应简单执行、复用执行和批量执行三种策略。 6. **StatementHandler**:处理 SQL 语句,...

    Mybatis分页拦截器

    具体实现时,开发者可以创建一个实现了Interceptor接口的类,然后在invoke方法中获取到SQL语句,添加分页条件,再将处理后的SQL语句传递给下一个拦截器或Mybatis的Executor执行。同时,拦截器还可以获取到参数和...

    03 mybatis高级(3) 2

    总结来说,本节内容涵盖了MyBatis与Spring集成的关键组件,如SqlSessionFactoryBean、MapperFactoryBean和MapperScannerConfigurer的源码解析,以及MyBatis插件机制的工作原理,包括责任链模式的应用和PageHelper...

    Mybatis源码分析-上课笔记1

    本篇文章将深入分析MyBatis的核心概念和源码结构。 首先,我们来看一下MyBatis的主要组件: 1. **Configuration**:这是MyBatis的核心配置对象,它包含了全局配置信息,如数据源、事务管理器、Mappers等。...

    mybatis-3-mybatis-3.3.0-SNAPSHOT.zip

    学习MyBatis源码有助于理解其工作流程,提升对数据库操作的控制力,还可以帮助开发者自定义扩展,比如编写自己的Executor实现、Interceptor插件等。这将有助于优化性能,解决特定场景下的问题,提升开发效率。在...

    Mybatis 源码项目搭建以及主流程分析

    5. **装饰器模式**:Mybatis的Executor执行器,通过装饰器模式扩展其功能,如SimpleExecutor、ReuseExecutor和BatchExecutor分别代表简单执行、复用Statement和批处理执行。 通过对Mybatis源码的阅读和项目实践,...

    Mybatis源码分析

    Mybatis允许用户自定义插件,插件可以拦截Executor、StatementHandler、ParameterHandler、ResultSetHandler等接口的方法,实现透明化的增强功能。 八、事务管理 Mybatis支持手动和自动两种事务管理模式。手动模式...

    mybatis-3-mybatis-3.5.4-src-read.zip

    在本压缩包“mybatis-3-mybatis-3.5.4-src-read.zip”中,包含了作者对MyBatis 3.5.4版本源码的阅读理解,特别进行了关键部分的注解和流程解析,对于学习和深入理解MyBatis的工作原理非常有帮助。 1. **MyBatis架构...

Global site tag (gtag.js) - Google Analytics