在MyBatis中,
- Configuration对象会采用new RoutingStatementHandler()来生成StatementHandler对象,
- 换句话说我们真正使用的是RoutingStatementHandler对象,
- 然后它会根据Executor的类型去创建对应具体的statementHandler对象
- (SimpleStatementHandler,PreparedStatementHandler和CallableStatementHandler)。
然后利用具体statementHandler的方法完成所需要的功能。
- 那么这个具体的statementHandler是保存在RoutingStatementHandler对象的delegate属性的,
- 所以当我们拦截statementHandler的时候就要常常访问它了。它们的关系如下图所示。
StatementHandler是MyBatis四大对象里面最重要的对象,它的方法是十分重要的,也是我们插件的基础。
- 当我们需要改变sql的时候,
- 显然我们要在预编译SQL(prepare方法前加入修改的逻辑)。
- 当我们需要修改参数的时候
- 我们可以在调用parameterize方法前修改逻辑。
- 或者使用ParameterHandler来改造设置参数。
- 我们需要控制组装结果集的时候,
- 也可以在query方法前后加入逻辑,
- 或者使用ResultHandler来改造组装结果。
- 懂的这些方法,才能理解我需要拦截什么对象,如何处理插件,这是MyBatis的核心内容。