//插件扩展实现类:
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();
}
}
}
分享到:
相关推荐
7. **Plugins**:MyBatis的插件机制,可以通过拦截器对Executor、StatementHandler、ParameterHandler和ResultSetHandler进行增强。 8. **MapperRegistry**:负责管理所有的Mapper接口和它们对应的XML配置。 9. **...
11. **插件机制**: MyBatis支持自定义插件,可以通过实现Interceptor接口,对Executor、StatementHandler、ParameterHandler和ResultSetHandler进行拦截,实现AOP功能,如性能监控、日志记录等。 12. **事务管理**:...
MyBatis提供了一种插件机制,允许用户自定义拦截器来拦截Executor、StatementHandler、ParameterHandler和ResultSetHandler的行为。通过源码,我们可以看到如何实现和注册这些插件。 通过对MyBatis3源码的深入研究...
Mybatis 的源码对于学习和理解其工作原理、优化数据库操作以及自定义功能非常有帮助。本篇文章将深入探讨如何将Mybatis的源码导入Eclipse,并利用Eclipse的强大功能进行学习和调试。 首先,我们需要下载Mybatis的...
以上内容只是MyBatis基础部分的概述,实际使用中,MyBatis还有更多高级特性和最佳实践,如结果映射的复杂性、延迟加载、插件机制等,都需要深入学习和理解。通过阅读《MyBatis 基础笔记》的源代码,你可以更深入地...
5. **插件机制**: MyBatis允许用户自定义插件,可以拦截Executor、StatementHandler、ParameterHandler和ResultSetHandler四个接口的方法,实现自定义的功能,如性能监控。 6. **参数绑定**: MyBatis通过...
11. **延迟加载(Lazy Loading)**:MyBatis提供了延迟加载机制,当需要关联的对象时,才真正去数据库加载数据,提高性能。 12. **缓存(Cache)**:MyBatis内置了两级缓存,一级缓存是SqlSession级别的,二级缓存...
1. **初始化过程**:了解MyBatis的初始化流程,包括SqlSessionFactoryBuilder的创建、SqlSessionFactory的构建,以及Configuration类中加载XML配置文件的过程。 2. **SQL执行**:研究Executor接口及其实现,如...
同时,插件的应用(如PageHelper分页插件)也会在这个文件夹中体现,它展示了如何自定义拦截器来增强MyBatis的功能。 手写MyBatis的练习是提升对MyBatis理解的好方法。首先,你需要理解MyBatis的主要功能,如动态...
这个资源" Mybatis-3 完整版源代码 java-source-code"包含了 Mybatis 3.x 版本的核心源码,这对于深入理解其工作原理、学习如何自定义拦截器、插件以及优化 SQL 查询非常有帮助。 首先,我们来探讨一下 Mybatis 的...
MyBatis的插件运行原理是基于拦截器机制,插件可以拦截四大对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)的方法。编写一个插件需要实现Interceptor接口,并使用@Intercepts注解来标记...
MyBatis提供插件机制,可以通过实现`Interceptor`接口创建插件,对Executor、StatementHandler、ParameterHandler、ResultSetHandler四个接口的方法进行拦截,实现自定义功能,如日志记录、性能监控等。 通过对...
5. **Executor**:执行器是 MyBatis 执行 SQL 的核心,分为 SimpleExecutor、ReusedExecutor 和 BatchExecutor。它们分别对应简单执行、复用执行和批量执行三种策略。 6. **StatementHandler**:处理 SQL 语句,...
具体实现时,开发者可以创建一个实现了Interceptor接口的类,然后在invoke方法中获取到SQL语句,添加分页条件,再将处理后的SQL语句传递给下一个拦截器或Mybatis的Executor执行。同时,拦截器还可以获取到参数和...
总结来说,本节内容涵盖了MyBatis与Spring集成的关键组件,如SqlSessionFactoryBean、MapperFactoryBean和MapperScannerConfigurer的源码解析,以及MyBatis插件机制的工作原理,包括责任链模式的应用和PageHelper...
本篇文章将深入分析MyBatis的核心概念和源码结构。 首先,我们来看一下MyBatis的主要组件: 1. **Configuration**:这是MyBatis的核心配置对象,它包含了全局配置信息,如数据源、事务管理器、Mappers等。...
学习MyBatis源码有助于理解其工作流程,提升对数据库操作的控制力,还可以帮助开发者自定义扩展,比如编写自己的Executor实现、Interceptor插件等。这将有助于优化性能,解决特定场景下的问题,提升开发效率。在...
5. **装饰器模式**:Mybatis的Executor执行器,通过装饰器模式扩展其功能,如SimpleExecutor、ReuseExecutor和BatchExecutor分别代表简单执行、复用Statement和批处理执行。 通过对Mybatis源码的阅读和项目实践,...
Mybatis允许用户自定义插件,插件可以拦截Executor、StatementHandler、ParameterHandler、ResultSetHandler等接口的方法,实现透明化的增强功能。 八、事务管理 Mybatis支持手动和自动两种事务管理模式。手动模式...
在本压缩包“mybatis-3-mybatis-3.5.4-src-read.zip”中,包含了作者对MyBatis 3.5.4版本源码的阅读理解,特别进行了关键部分的注解和流程解析,对于学习和深入理解MyBatis的工作原理非常有帮助。 1. **MyBatis架构...