mybatis 自定义插件
mybatis 插件
Mybatis 所允许拦截的方法:
- 执行器 Executor(update、query、commit、rollback等方法)
- SQL语法构建器 StatementHandler(prepare、parameterize、batch、update、query等方法)
- 参数处理器 ParameterHandler(getParameterObject、setParameters)
- 结果集处理器 ResultSetHnadler(handlerResultSets、handleOutputParameters等方法)
Mybatis 插件原理
在四大对象创建的时候:
- 每个创建出来的对象不是直接返回的,而是InterceptorChain.pluginAll(Object)
- 获取到所有的 Interceptor(拦截器)(插件需要实现的接口),调用 Interceptor.plugin(target),,返回包装后的对象
- 插件机制,我们可以使用插件为目标对象创建一个代理对象,AOP(面向切面)我们的插件可以为四大对象创建出代理对象,代理对象就可以拦截到四大对象的每一个执行
实现自定义插件
1 @Intercepts({ 2 // 方法签名 3 @Signature(type = StatementHandler.class,//Executor.class, //那个类 4 method = "prepare", //那个方法 5 // 方法参数 6 args = {Connection.class, Integer.class}), 7 @Signature(type = Executor.class, 8 method = "query", 9 args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}) 10 11 }) 12 public class MyPlugin implements Interceptor { 13 14 private final Logger logger = LoggerFactory.getLogger(MyPlugin.class); 15 16 /** 17 * 插件的核心方法 18 * @param invocation 19 * @return 20 * @throws Throwable 21 */ 22 @Override 23 public Object intercept(Invocation invocation) throws Throwable { 24 logger.info("-----------------对方法进行增强------------------"); 25 26 // 继续向下执行 27 return invocation.proceed(); 28 } 29 30 /** 31 * 生成 target 的代理对象 32 * @param o 将要包装的对象 33 * @return 34 */ 35 @Override 36 public Object plugin(Object o) { 37 logger.info("-----将要包装的目标对象"+ o); 38 return Plugin.wrap(o, this); 39 } 40 41 /** 42 * 传递插件所需参数 43 * @param properties 44 */ 45 @Override 46 public void setProperties(Properties properties) { 47 logger.info("插件初始化参数:"+properties); 48 } 49 }
原生mybatis,需要在配置文件(sqlMapConfig.xml)中配置:
<!-- 插件 --> <plugins> <!--自定义的插件--> <plugin interceptor="com.scdzyc.plugin.MyPlugin"> <property name="name" value="myPlugin"/> </plugin> </plugins>
浙公网安备 33010602011771号