Mybatis plugin (plugin) Development

 

Mybatis write plug-ins:

  • 1, the preparation of the implementation class Interceptor
  • 2, @Intercepts complete annotation plug-in signatures
  • 3, the write plug-ins registered to the global configuration file
/**
 * 完成插件签名:
 *		告诉MyBatis当前插件用来拦截哪个对象的哪个方法
 */
@Intercepts(
		{
		@Signature(type=StatementHandler.class,method="parameterize",args=java.sql.Statement.class)
		})
public class MyFirstPlugin implements Interceptor{

	/**
	 *
	 * 拦截目标对象的目标方法的执行
	 */
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		// TODO Auto-generated method stub
		System.out.println("MyFirstPlugin...intercept:"+invocation.getMethod());
		//动态的改变一下sql运行的参数:以前1号员工,实际从数据库查询2号员工
		Object target = invocation.getTarget();
		System.out.println("当前拦截到的对象:"+target);
		//拿到:StatementHandler==>ParameterHandler===>parameterObject
		//拿到target的元数据
		MetaObject metaObject = SystemMetaObject.forObject(target);
		Object value = metaObject.getValue("parameterHandler.parameterObject");
		System.out.println("sql语句用的参数是:"+value);
		//修改完sql语句要用的参数
		metaObject.setValue("parameterHandler.parameterObject", 2);
		//执行目标方法
		Object proceed = invocation.proceed();
		//返回执行后的返回值
		return proceed;
	}

	/**
	 *
	 *包装目标对象的:为目标对象创建一个代理对象
	 */
	@Override
	public Object plugin(Object target) {
		// TODO Auto-generated method stub
		//我们可以借助Plugin的wrap方法来使用当前Interceptor包装我们目标对象
		System.out.println("MyFirstPlugin...plugin:mybatis将要包装的对象"+target);
		Object wrap = Plugin.wrap(target, this);
		//返回为当前target创建的动态代理
		return wrap;
	}

	/**
	 * 
	 *将插件注册时 的property属性设置进来
	 */
	@Override
	public void setProperties(Properties properties) {
		// TODO Auto-generated method stub
		System.out.println("插件配置的信息:"+properties);
	}

}

Registered in the global configuration file:

<!-- mybatis-config.xml -->
<plugins>
  <plugin interceptor="org.mybatis.example.MyFirstPlugin">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>

 

Plug-ins are used to wrap the four objects, intercept method specified:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

  • ParameterHandler (getParameterObject, setParameters)

  • ResultSetHandler (handleResultSets, handleOutputParameters)

  • StatementHandler (prepare, parameterize, batch, update, query)

     

Role in the implementation of four objects CRUD method of:

1), Mappe proxy object calls DefaultSqlSession CRUD method, DefaultSqlSession is actually called the update Executor (additions and deletions), query;

2), Executor creates a StatementHandler objects (but also create ParameterHandler and ResultSetHandler)

3), Executor using StatementHandler precompiled sql, and using ParameterHandler to set parameters to sql

4), Executor call StatementHandler CRUD method;

5), ResultSetHandler result set Package

 

When the four objects created, not directly direct return, will call interceptorChain.pluginAll (target):

public Object pluginAll(Object target) {
  //使用每一个插件来创建一个代理对象
		    for (Interceptor interceptor : interceptors) {
		      target = interceptor.plugin(target);
		    }
		    return target;
		  }

 

Guess you like

Origin www.cnblogs.com/qzlcl/p/11312115.html