mybatis插件原理及使用
一、简介
这里介绍mybatis中插件的原理及使用。将结合源码及示例进行说明。
二、插件应用场景
插件是mybatis的扩展方式,可用于添加默认值、日志记录、黑白名单等。
三、插件编写方式
mybatis插件是通过拦截器实现的,编写插件需要标识拦截方法和实现拦截逻辑。
3.1 标识拦截方法
标识拦截拦截方法是通过注解org.apache.ibatis.plugin.Intercepts和注解org.apache.ibatis.plugin.Signature实现的。
3.1.1 Intercepts注解
Intercepts注解内是一个Signature注解(每个Signature注解标识了一个需要拦截的方法)列表。Intercepts注解定义如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Intercepts {
Signature[] value();
}
3.1.2 Signature注解
Signature注解位于Intercepts注解内,每个Signature注解标识了一个需要拦截的方法。Signature注解定义如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
})
public @interface Signature {
//拦截的类对象
Class<?> type();
//拦截的方法名
String method();
//拦截方法的参数定义
Class<?>[] args();
}
3.2 可拦截方法
mybatis插件可以对Executor、ParameterHandler、ResultSetHandler和StatementHandler接口的实现类进行拦截。
mybatis对上述接口的处理流程如下:
3.2.1 Executor接口
Executor接收请求处理,负责请求处理的全过程。
public interface Executor {
ResultHandler NO_RESULT_HANDLER = null;
int update(MappedStatement ms, Object parameter) throws SQLException;
<E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException;
<E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException;
<E> Cursor<E> queryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds) 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, BoundSql boundSql);
boolean isCached(MappedStatement ms, CacheKey key);
void clearLocalCache();
void deferLoad(MappedStatement ms, MetaObject resultObject, String property, CacheKey key, Class<?> targetType);
Transaction getTransaction();
void close(boolean forceRollback);
boolean isClosed();
void setExecutorWrapper(Executor executor);
}
3.2.2 ParameterHandler接口
ParameterHandler是参数的处理,通过插件可以对参数进行修改设置。
public interface ParameterHandler {
Object getParameterObject();
void setParameters(PreparedStatement ps)throws SQLException;
}
3.2.3 StatementHandler接口
StatementHandler是执行sql的过程,通过插件可以重写sql。
public interface StatementHandler {
Statement prepare(Connection connection, Integer transactionTimeout)
throws SQLException;
void parameterize(Statement statement)
throws SQLException;
void batch(Statement statement)
throws</