一、MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。
默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:(摘自官网http://mybatis.github.io/mybatis-3/zh/configuration.html)
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
二、当执行查询时
调用过程:SqlSession.selectList -- >> Executor.query -->> StatementHandler.query 返回结果,那么参数的设置是在哪呢?
StatementHandler有3个子类:SimpleStatementHandler、PreparedStatementHandler、CallableStatementHandler,
分别对应java.sql的Statement, PreparedStatement,CallableStatement。
在执行Executor.query时,创建Statement(StatementHandler.prepare)后会执行StatementHandler的parameterize,也就是参数化设置。查看源码发现调用的时ParameterHandler 的setParameters方法,在该方法中会设置对应的参数。
三、在查询过程中想要做一些额外的工作。例如:分页等
则可以通过mybatis的拦截器,拦截查询方法:
1、拦截Executor的query方法。拦截多个参数的方法。如果拦截参数少的那个方法,则可以在拦截器中参数源码自定义调用。
2、StatementHandler 的query方法
3、ResultSetHandler 的handleResultSets或handleOutputParameters,直接对结果进行处理
在拦截器中可以修改SQL,设置参数等一系列自定义功能。