在MyBatis中,sql
- 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的核心內容。