![5be225db0f32b0136c014f339c5b9174.png](https://i-blog.csdnimg.cn/blog_migrate/8a17502a10ffa7229c888cc5c79785b3.jpeg)
该系列文章针对 Mybatis 3.5.1 版本
在 mybatis 中允许针对 SQL 在执行前后进行扩展操作,而这些扩展操作也叫做插件。
在 Mybaits 中允许用插件来拦截的方法包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
实现一个 plugin 的 步骤如下
step1、插件实现类实现了 Interceptor
接口
step2、通过注解 @Intercepts
指定了该插件需要拦截的对象
step3、在 mybatis-config.xml
中的 <plugins>
下配置插
自定义简易 SQL 打印插件
简易 SQL 打印插件,忽略细节
思路
SQL 在 Mybatis 启动完成后已经被加载到了 Configuration
对象中,所以无论是 Executor
、ParameterHandler
、ResultSetHandler
、StatementHandler
哪一种情况下的拦截,只要持有了Configuration
对象也就相当于有了执行 SQL,而SQL 参数也是一样的,而在 Mybatis 运行期间 Configuration
对象会伴随整个执行流程,包括 Executor
、ParameterHandler
、ResultSetHandler
、StatementHandler
等环节。
在 Mybatis 中执行的处理流程无论是需要参数处理或者结果集处理,最后所有的方法都会经由 Executor
所有,只需要拦截 Executor
对象即可。
针对 SQL 的打印,及其结果打印,只针对增删改查方法,而在 Executor
中,增删改由 Executor#update
完成,查则由 Executor#query
实现。
所以针对 SQL 的打印只需要拦截 Executor#update
和 Executor#query
方法即可
代码实现
step1、创建插件类 PrintSqlPlugin
并实现 Interceptor
接口
step2、追加注解 @Intercepts
指定拦截对象
方法都有重载的方法,需要指定多个特定的参数来特指特定的方法,这里为演示案例不写全
step 1、和step 2 实现后的代码结构如下:
代码实现如下:
![d9741dd1d5ee0bc2cfad1fdae9b75247.png](https://i-blog.csdnimg.cn/blog_migrate/65d2d25a4ab2cb6b3c5eaac58ab80634.jpeg)
Interceptor#interceptor
部分代码如下:
![6ae4e9741b25d9a2c85ec931f2c2d209.png](https://i-blog.csdnimg.cn/blog_migrate/4310196d2b33b3f9678747ef4d6babf6.jpeg)
主体执行逻辑(具体实现不展开)
- 1、获取执行 SQL。(如:
select * from user_info where id = ?
) - 2、获取执行 SQL 对应的参数。(如:param1 = 1)
- 3、将SQL 对照对应的参数进行拼接,并打印相关SQL数据。(如:select * from user_info where id = 1)
- 4、调用原有对象 target 执行sql查询,并获得结果集
- 5、打印结果数据
step3、在 mybatis-config.xml
中配置
![18a243737fbb5c55f3b90e5b38334d4b.png](https://i-blog.csdnimg.cn/blog_migrate/2de16fff7dd735e270db1be711165709.jpeg)
测试,控制台打印日志如下
![3da9fcafba12f2856160824287d4c86d.png](https://i-blog.csdnimg.cn/blog_migrate/661f36239cb9a08c4e40f63101071a7f.jpeg)