一、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,設置參數等一系列自定義功能。