以下是 com.baomidou.mybatisplus.core.override.MybatisMapperProxy
類的詳細解析:
1. 類的作用
MybatisMapperProxy
是 MyBatis-Plus 框架中用于實現 Mapper 接口動態代理的核心類。它繼承自 MyBatis 的 MapperProxy
,并擴展了以下功能:
- 增強 MyBatis 原生功能:如自動填充、邏輯刪除、分頁查詢等。
- 攔截 Mapper 方法調用:在方法執行前后插入自定義邏輯(如 SQL 優化、參數校驗)。
- 動態 SQL 構建:支持自動生成基礎 CRUD 的 SQL 語句(如
selectById
、insert
)。
2. 核心功能與實現
(1) 動態代理機制
- 繼承關系:
MybatisMapperProxy
繼承自 MyBatis 的MapperProxy
,并重寫了invoke
方法。 - 代理對象生成:當調用 Mapper 接口時,MyBatis-Plus 會通過
MapperProxyFactory
創建MybatisMapperProxy
的實例作為代理對象。 - 方法攔截:在
invoke
方法中,攔截 Mapper 接口的調用,執行增強邏輯后再調用原始 SQL。
(2) 關鍵方法
-
invoke
方法:@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 1. 判斷是否為 Object 的默認方法(如 toString),直接調用// 2. 判斷是否為 MyBatis-Plus 增強方法(如 selectList Wrapper)// 3. 執行攔截器(Interceptor)鏈(如自動填充、邏輯刪除)// 4. 調用原始 MapperProxy 的 invoke 方法執行 SQLreturn super.invoke(proxy, method, args); }
- 增強邏輯:在調用原始 SQL 之前,會執行 MyBatis-Plus 的攔截器鏈(
Interceptor
),例如:- 自動填充:通過
MetaObjectHandler
自動填充字段(如創建時間、更新時間)。 - 邏輯刪除:通過
IS_DELETED
字段過濾已刪除數據。 - 分頁插件:動態拼接分頁 SQL。
- 自動填充:通過
- 增強邏輯:在調用原始 SQL 之前,會執行 MyBatis-Plus 的攔截器鏈(
(3) 與 MyBatis-Plus 核心組件的關聯
SqlSessionFactory
:通過工廠生成 SQL 會話。Interceptor
:攔截器鏈(如分頁插件、邏輯刪除插件)在此處被調用。MapperRegistry
:注冊 Mapper 接口,管理代理對象的創建。
3. 典型使用場景
(1) 基礎 CRUD 自動化
- 當調用
BaseMapper
的方法(如selectById
、insert
)時,MybatisMapperProxy
會自動生成對應的 SQL 語句。 - 示例:
User user = userMapper.selectById(1L); // 自動生成 SELECT * FROM user WHERE id = 1
(2) 攔截器擴展
- 通過自定義
Interceptor
實現擴展邏輯:public class MyInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 攔截 SQL 執行前的邏輯(如日志、權限校驗)return invocation.proceed(); // 繼續執行后續邏輯} }
(3) 邏輯刪除
- 當查詢時,自動添加
IS_DELETED = 0
條件:List<User> users = userMapper.selectList(null); // 自動過濾已刪除數據
4. 常見問題排查
(1) SQL 未生效
- 檢查是否配置了
@TableName
注解或表名映射。 - 確保
BaseMapper
被正確繼承。
(2) 攔截器未生效
- 檢查攔截器是否被正確注冊到
MyBatis-Plus
配置中:@Configuration public class MyBatisPlusConfig {@Beanpublic MybatisInterceptor mybatisPlusInterceptor() {MybatisInterceptor interceptor = new MybatisInterceptor();interceptor.addInterceptors(new MyInterceptor());return interceptor;} }
5. 源碼關鍵路徑
- 代理工廠:
MapperProxyFactory
創建MybatisMapperProxy
。 - 攔截器鏈:
InterceptorChain
調用所有注冊的攔截器。 - SQL 執行:最終通過
SqlSession
執行 SQL。
6. 總結
MybatisMapperProxy
是 MyBatis-Plus 的核心代理類,通過動態代理和攔截器機制實現了功能增強。開發者可通過自定義攔截器或配置擴展其行為,例如實現權限校驗、日志記錄或 SQL 優化。