mybatis架构
mybatis工作原理
执行流程:
- 读取核心配置文件并返回InputStream流对象。
- 根据InputStream流对象解析出Configuration对象,然后创建SqlSessionFactory工厂对象
- 根据一系列属性从SqlSessionFactory工厂中创建SqlSession
- 从SqlSession中调用Executor执行数据库操作&&生成具体SQL指令
- 对执行结果进行二次封装
- 提交与事务
mybatis插件简介
mybatis插件就是在执行数据库操作的时候,对于特定方法进行拦截增强,做一些额外的处理的一种方式。
myabtis的插件的增强原理是利用动态代理实现的,可以对数据库操作的执行类做拦截,mybatis主要操作流程如下:
mybatis中的几个操作数据库的执行类是:Executor、StatementHandler、ParameterHandler、ResultSetHandler,其中:
Executor 是总的执行者,他就像一个大总管,用于协调管理其他执行者。
StatementHandler 拦截Sql语法构建的处理, 是用于生成Statement或者PreparedStatement的执行者,同时他会调用ParameterHandler进行对sql语句中的参数设值,设置完了之后会通过StatementHandler 去调用sql在数据库中执行,最后返回一个结果集,通过ResultSetHandler将结果集和对应的实体进行映射填充数据,之后会把结果实体返回给StatementHandler。
ParameterHandler :拦截参数的处理
ResultSetHandler :拦截结果集的处理
所以,我们对这几个执行者进行拦截,比如对于StatementHandler 拦截,即是对于sql操作进行拦截,Mybatis自定义插件必须实现Interceptor接口:
1 | public interface Interceptor { |
- intercept方法:拦截器具体处理逻辑方法
- plugin方法:根据签名signatureMap生成动态代理对象
- setProperties方法:设置Properties属性
下面就对于这个StatementHandler 进行拦截做一个分页实例。
分页插件
需求
拦截数据sql,实现分页功能
实现
1 | /** |
myabtis自定义插件只需要实现Interceptor接口即可,并且注解@Intercepts以及@Signature配置需要拦截的对象,其中
- type是需要拦截的对象Class,
- method是对象里面的方法,
- args是方法参数类型。
注入插件到拦截链
这里有两种方式注入
方式一:直接注入
1
Spring boot项目中只需要在拦截器类上加 @Component 注解即可。
方式二:通过myabtis配置加入到拦截链中(多个拦截器时,这种方式可以控制拦截顺序)
1 |
|