Mybatis 插件开发

都快忘了咋开发插件了,这里从新记录一下。后面有时间写个自动下划线转驼峰插件和分页插件吧。现在就先写个简单的插件例子

 

1、首先创建类实现Interceptor,可以拦截四个类 本例拦截Executor类 拦截方法query

package com.back.plugin;

import java.util.Properties;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
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;
/**
 * mybatis插件开发 可拦截四个接口:
 * ResultSetHandler StatementHandler ParameterHandler  Executor
 * Executor 可以拦截增删改查方法,本示例拦截的所有查询的方法
 * @author back
 *
 */
@Intercepts({
	@Signature(type=Executor.class, method="query", args={MappedStatement.class, Object.class, 
			RowBounds.class,ResultHandler.class})
})
public class BackExecutorInterceptor implements Interceptor{

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		Object[] args = invocation.getArgs();
		System.out.println("111");
		MappedStatement ms = (MappedStatement)args[0];
		BoundSql boundSql = ms.getBoundSql(args[1]);
		System.out.println("本次调用执行sql : " + boundSql.getSql());
		return invocation.proceed();
	}

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

	@Override
	public void setProperties(Properties properties) {
		
	}

}

2、将plugin设置生效 在mybatis-config.xml中设置 这里的property是没有用的 只不过展示 可以传参 类中的setProperties能收到

<plugins>
		<plugin interceptor="com.back.plugin.BackExecutorInterceptor" >
				<property name="prop" value="11"/>
		</plugin>
	</plugins>

3、之所以展示Executor是因为写例子过程中发现,Executor有两个query方法,但是有BoundSql和CacheKey的方法拦截不生效,这里展示了下 拦截第一个后自己获得BoundSql来进行一些处理,我这里只是打印了下sql

4、调用Api,发现plugin生效:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章