mybatis|mybatis 插件

Mybatis插件又称拦截器,本篇文章中出现的拦截器都表示插件。
Mybatis采用责任链模式,通过动态代理组织多个插件(拦截器),通过这些插件可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插件前最好了解下它的原理,以便写出安全高效的插件。
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor 接口中的方法:update, query, flushStatements, commit, rollback, getTransaction, close, isClosed
  • ParameterHandler接口中的方法:getParameterObject, setParameters
  • ResultSetHandler 接口中的方法:handleResultSets, handleOutputParameters
  • StatementHandler 接口中的方法:prepare, parameterize, batch, update, query
总体概括为:
  • 拦截执行器的方法
  • 拦截参数的处理
  • 拦截结果集的处理
  • 拦截Sql语法构建的处理
Mybatis是通过动态代理的方式实现拦截的,阅读此篇文章需要先对Java的动态代理机制有所了解。
Mybatis四大接口
既然Mybatis是对四大接口进行拦截的,那我们先要知道Mybatis的四大接口是哪些: Executor, StatementHandler, ResultSetHandler, ParameterHandler。
Mybatis插件能够对这四大对象进行拦截,可以说包含到了Mybatis一次SQL执行的所有操作。可见Mybatis的的插件很强大。
  1. Executor是 Mybatis的内部执行器,它负责调用StatementHandler操作数据库,并把结果集通过 ResultSetHandler进行自动映射,另外,他还处理了二级缓存的操作。从这里可以看出,我们也是可以通过插件来实现自定义的二级缓存的。
  2. StatementHandler是Mybatis直接和数据库执行sql脚本的对象。另外它也实现了Mybatis的一级缓存。这里,我们可以使用插件来实现对一级缓存的操作(禁用等等)。
  3. ParameterHandler是Mybatis实现Sql入参设置的对象。插件可以改变我们Sql的参数默认设置。
  4. ResultSetHandler是Mybatis把ResultSet集合映射成POJO的接口对象。我们可以定义插件对Mybatis的结果集自动映射进行修改。
插件Interceptor
Mybatis的插件实现要实现Interceptor接口,我们看下这个接口定义的方法。
public interface Interceptor { /** * 拦截目标对象中目标方法的执行 * @param invocation * @return * @throws Throwable */ Object intercept(Invocation invocation) throws Throwable; /** * 包装目标对象,即为目标对象创建一个代理对象 * @param target * @return */ Object plugin(Object target); /** *可以获取插件注册时,传入的property属性 * @param properties */ void setProperties(Properties properties); }

【mybatis|mybatis 插件】http://blog.sina.com.cn/s/blog_14905e10f0102xmij.html

    推荐阅读