mybatis插件是一种运行时增强机制,允许sql执行的关键环节插入自定义逻辑,而无需修改源码,其基于jdk动态代理与责任链模式,
可以拦截以下组件:
executor,执行增删改查
parameterhandler,处理参数
resultsethandler,处理结果集
statementhandler,管理jdbc statement
运行机制:
1.加载阶段:mybatis启动解析mybatis-config.xml中的插件,将实现intercept接口的插件注册到interceptorchain
2.代理生成:创建核心对象(如executor)时,interceptorchain调用插件的plugin()方法,通过plugin.warp()生成代理对象,
3.方法拦截:调用被代理对象的方法时,触发intercept(),可在调用前后植入逻辑,再通过invocation.proceed方法执行元方法,
4.多插件顺序,按配置顺序生成代理链,后配置的先执行
插件编写步骤:
1.实现interceptor接口
2.定义拦截点,使用@intercepts+@signture注解指定拦截的接口,方法及其参数类型,
3.在intercept()方法中实现增强逻辑,
4.生成代理plugin()方法中调用plugin.warp(target,this)
5.处理属性,setproperties()接受配置参数
6.注册插件,在mybatis-config.xml中标签
常见场景:
拦截executor,获取sql,添加limit
拦截statementhandler,获取sql,多租户改写
拦截executor,设置数据库标识,读写分离
拦截statementhandler,sql慢查询监控
拦截parameterhandler,对指定参数脱敏
拦截resultsethandler,对数据库中解密数据进行解密