https://blog.csdn.net/ykzhen2015/article/list/2?t=1java
MyBatis的主要成員sql
- Configuration MyBatis全部的配置信息都保存在Configuration對象之中,配置文件中的大部分配置都會存儲到該類中
- SqlSession 做爲MyBatis工做的主要頂層API,表示和數據庫交互時的會話,完成必要數據庫增刪改查功能
- Executor MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護
- StatementHandler 封裝了JDBC Statement操做,負責對JDBC statement 的操做,如設置參數等
- ParameterHandler 負責對用戶傳遞的參數轉換成JDBC Statement 所對應的數據類型
- ResultSetHandler 負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合
- TypeHandler 負責java數據類型和jdbc數據類型(也能夠說是數據表列類型)之間的映射和轉換
- MappedStatement MappedStatement維護一條<select|update|delete|insert>節點的封裝
- SqlSource 負責根據用戶傳遞的parameterObject,動態地生成SQL語句,將信息封裝到BoundSql對象中,並返回
- BoundSql 表示動態生成的SQL語句以及相應的參數信息
一、支持 xml 和annotation 兩種配置數據庫
二、mapper 執行緩存
- 在binding 包下面,MapperProxy 動態代理 Mapper 接口(因此接口能返回結果)
- MapperRegistry 管理mapper 接口
三、插件實現app
Plugin 類動態代理全部插件,根據簽名判斷要不要執行插件intercept 方法.net
- executor, statementHandler,parameterHandler,resultHandler(四大對象)
- statementHandler
- RoutingStatementHandler,這是一個封裝類,它不提供具體的實現,只是根據Executor的類型,建立不一樣的類型StatementHandler。
- SimpleStatementHandler,這個類對應於JDBC的Statement對象,用於沒有預編譯參數的SQL的運行。
- PreparedStatementHandler 這個用於預編譯參數SQL的運行。
- CallableStatementHandler 它將實存儲過程的調度。
四、typeHandler插件
五、一級緩存、二級緩存代理
- 增刪改查,除了查詢都會更新緩存,可是僅僅會更新本Mapper 的緩存結果,若是別的mapper 查詢結果中也包含相關信息,不會刷新,髒數據產生緣由
六、級聯查詢的懶加載實現code
懶加載:xml
- 結果處理時,ResultSetHandler 會建立JavassistProxyFactory 內部類EnhancedResultObjectProxyImpl 動態代理 結果類型
- 當調用 is get 或(hashcode、equals、toString、clone)時,觸發代理執行數據加載
- ResultLoader 裏面執行sql 獲取懶加載結果(調用executor 對象的方法)
級聯查詢
- 關於MyBatis級聯有三種:
- association :一對一的關聯
- collection : 一對多的關聯
- discriminator :鑑別器
- N+1 問題
- 設置懶加載,一對多關聯查詢,每一條返回結果,get、is、hash等方法會觸犯而次查詢,懶加載致使N 條結果N次查詢,而不是查詢全部
- 如下設置爲全局設置
八、Executor
- SimpleExecutor -- SIMPLE 就是普通的執行器。
- ReuseExecutor -執行器會重用預處理語句(prepared statements)
- BatchExecutor --它是批量執行器
九、Example 自動生成sql