分表查询的思路很简单,就是在sql的运行过程中的某一阶段,拦截下sql,将它“自动”路由到分表中的任意一个
一、Mybatis Interceptor接口使用
按照思路所说,自然要想办法把运行到某一阶段的sql拦截下来并做更改,那么就需要Interceptor。
Interceptor可以拦截的方法,官网描述如下:
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
-
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。
sql语句是被封装在BoundSql里的,而BoundSql由StatementHandler获取,所以我们拦截StatementHandler的prepare方法(StatementHandler和BoundSql部分源码如下)。
public interface StatementHandler { BoundSql getBoundSql(); ParameterHandler getParameterHandler(); }
public class BoundSql { private String sql; public BoundSql(Configuration configuration, String sql, List<ParameterMapping> parameterMappings, Object parameterObject) { this.sql = sql; ...... } public String getSql() { return sql; } }