1.MyBatis 如何实现自定义插件?

实现原理:

MyBatis 自定义插件针对 MyBatis
四大对象(Executor,StatementHandler,ParamentHandler,ResultSetHandler)进行拦截。

* Executor  :拦截内部执行器,它负责调用StatementHandler 操作数据库,并把结果集通过 ResultSetHandler
进行自动映射,另外它还处理了二级缓存的操作。
* StatementHandler  :拦截 SQL 语法构建的处理,它是MyBatis 直接和数据库执行 SQL脚本的对象,另外它也实现了
MyBatis一级缓存
* ParamenterHandler  :拦截参数的处理。
* ResultSetHandler  :拦截结果集的处理。
实现关键:

MyBatis 插件要实现 Interceptor 接口,接口包含的方法,如下:
public interface Interceptor { Object intrceptor(Invocation invocation)
throws Throwable; Object plugin(Object target); void setProperties(Properties
properties); }
* setProperties() 方法是在 MyBatis 进行配置插件的时候可以配置自定义相关属性,即:接口实现对象的参数配置。
* plugin()
方法是插件用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理,可以决定是否要进行拦截,进而决定要返回一个什么样的目标对象。
* interceptor()  方法就是要进行拦截的时候要执行的方法。
自定义插件实现示例:
@Intercepts({ @Signature(type = Executor.class, method = "query", args = {
MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }) })
public class TestInterceptor implements Interceptor { @Override public Object
intercept(Invocation invocation) throws Throwable { Object target =
invocation.getTarget();// 被代理方法 Method method = invocation.getMethod();// 代理方法
Object[] args = invocation.getArgs();// 方法参数 // do something......方法拦截前执行代码块
Object result = invocation.proceed(); // do something......方法拦截后执行代码块 return
result; } @Override public Object plugin(Object target) { // TODO
Auto-generated method stub return Plugin.wrap(target, this); } @Override public
void setProperties(Properties properties) { // TODO Auto-generated method stub
} }
 

技术
©2019-2020 Toolsou All rights reserved,
Django个人博客搭建教程---时间分类归档你不知道的鸿蒙——HarmonyOS记录一次游戏私服getshell过程mysql联合索引详解百度网盘偷偷更新,终于实现免费不限速了! 全球第一免费开源ERP Odoo Ubuntu最佳开发环境独家首发分享uniapp页面传值总结Android中获取当前正在显示的Activity实例SQL Server 数据库词汇表Python垃圾回收与内存泄露