一:背景,
很多业务场景下我们都需要拦截器sql,达到不入侵原有代码的业务处理一些东西,比如分页,数据权限过滤操作,Sql执行时间监控等等,这里我们就要用到Mybatis拦截器Interceptor 。
Mybatis 的核心介绍
- configuration.初始化基础配置,比如Mybatis的别名,一些重要的类型对象,Mybatis的所有的配置信息都维持在Configuration对象之中 。
- SqlSessionfactory ,Sqlsession工厂。
- Sqlsession 作为mybatis的工作的主要的顶层api ,表示何数据库交互的会话,完成必要数据库的增删查改的一些功能。
- Executor Mybatis的执行器。是Mybatis调度的核心,负责sql语句的生成何查询缓存的威威。
- StatementHandler 封装了JDBC Statement 操作。比如参数的设置,将state吗结果转化为list集合操作等等。
- ParameterHandler 负责将JDBC返回参数转化为JDBC statment 的参数
- ResultSethandler 负责将JDBC返回的Resultset集对象转化为list类型的集合
- TypeHandler 负责将数据库的类型何实体类型之间的转化何映射
- MappedStatement ,MappedStatement维护一条Select,update,delete,insert 节点的封装。
- SqlSource 负责根据用户传递的parameterObject 动态的生成一条sql语句。
- Sboundsql 表示动态生成的sql何对应的参数信息。
Mybatis 的原理何实现
- Mybatis 支持对Executor,StatmentHanderl ,Pameterhandler何ResultSethandler 接口进行拦截。也就是说会对四种对象进行代理。
- 通过SqlSessionFactoryBean,
- 拦截器 ,可以通过配置拦截器链,把将要拦截的任务放到相应的拦截器的下边以共他们取实现。
- 自己对与拦截器的实现原理实现的猜想。
- 从以下带么可以看出mybatis在实例化Executor ,ParameterHandler,resultsetHandler,StatementHanderls,在实例化四大接口对象的时候,就回调用interceptorChain.pluginAll() 方法插进去,其实就是循环执行拦截器链所有的连接的plugin()fangfa .
- mybatis 官方推荐的方法是plugin方法是plugin.wrap()方法,这个类就是我们上表的TargetProxy代理
我们自己实现拦截器的代码:
- mybatis 的Intercepts 的用法
- mybatis 主要用到的涉及面膜是有动态代码,反射机制何责任链这集中设计模式。所以这几个东西非常的关键要做深入的理解。
- https://blog.csdn.net/aowhb28884/article/details/101696349