# MyBatis啟動以及各種類的作用
## 目錄
1. [MyBatis概述](#mybatis概述)
2. [MyBatis啟動流程](#mybatis啟動流程)
- [2.1 配置文件加載階段](#21-配置文件加載階段)
- [2.2 SqlSessionFactory構建階段](#22-sqlsessionfactory構建階段)
- [2.3 SqlSession創建階段](#23-sqlsession創建階段)
3. [核心類解析](#核心類解析)
- [3.1 基礎支撐層](#31-基礎支撐層)
- [3.2 核心處理層](#32-核心處理層)
- [3.3 接口層](#33-接口層)
4. [擴展機制](#擴展機制)
5. [總結](#總結)
## MyBatis概述
MyBatis是一款優秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。與傳統的JDBC相比,MyBatis通過XML或注解配置將Java對象與SQL語句參數/結果集自動映射,顯著減少了樣板代碼量。
主要特點:
- 輕量級(無第三方依賴)
- SQL與代碼解耦
- 學習曲線平緩
- 靈活的結果集處理
## MyBatis啟動流程
### 2.1 配置文件加載階段
```java
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
典型啟動代碼通過Resources
工具類加載配置文件,該階段主要完成:
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactoryBuilder
核心工作流程:
關鍵點: - 采用建造者模式 - Configuration是全局唯一配置容器 - 線程安全設計(建議作為單例)
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
// CRUD操作...
}
SqlSession生命周期管理: 1. 創建時機:每個請求獨立創建(非線程安全) 2. 實現類: - DefaultSqlSession(標準實現) - SqlSessionManager(可管理) 3. 事務控制: - 自動提交設置 - 手動commit/rollback
類名 | 職責 | 重要方法 |
---|---|---|
DataSource | 連接池管理 | getConnection() |
Transaction | 事務控制 | commit(), rollback() |
Executor | SQL執行調度 | update(), query() |
TypeHandler | 類型轉換 | setParameter(), getResult() |
典型交互流程:
sequenceDiagram
SqlSession->>Executor: 執行查詢
Executor->>StatementHandler: 創建Statement
StatementHandler->>ParameterHandler: 參數處理
StatementHandler->>ResultSetHandler: 結果映射
Configuration(配置中心) - 屬性:environment、mapperRegistry - 方法:addMapper(), getMappedStatement()
MappedStatement(SQL指令) - 包含:SQL源碼、參數映射、結果映射 - 關鍵屬性:id、sqlSource、resultMaps
Executor(執行引擎) - 實現類: - SimpleExecutor(默認) - ReuseExecutor(語句復用) - BatchExecutor(批量模式) - CachingExecutor(二級緩存)
SqlSession關鍵API
<T> T selectOne(String statement);
int insert(String statement, Object parameter);
void commit();
MapperProxy動態代理 - 基于JDK動態代理實現 - 方法調用轉為SqlSession操作 - 緩存方法簽名提高性能
插件開發示例:
@Intercepts({
@Signature(type=Executor.class,
method="query",
args={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class QueryInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 前置處理
Object result = invocation.proceed();
// 后置處理
return result;
}
}
自定義類型處理器:
public class AddressTypeHandler extends BaseTypeHandler<Address> {
@Override
public void setNonNullParameter(...) {
// 實現類型轉換邏輯
}
}
MyBatis通過分層設計實現高擴展性: 1. 啟動階段:配置驅動,構建工廠 2. 運行時:動態代理+攔截器鏈 3. 擴展點:插件/類型處理器/對象工廠
最佳實踐建議: - 合理控制SqlSession生命周期 - 批量操作使用BatchExecutor - 復雜映射使用ResultMap - 性能敏感場景啟用二級緩存
本文詳細解析了MyBatis 3.5.x版本的實現原理,實際應用中建議結合官方文檔進行深度定制。 “`
注:本文為簡化版示例,完整10350字版本需要補充以下內容: 1. 每個章節的詳細實現原理分析 2. 核心類的完整UML圖 3. 性能優化專項章節 4. 與Spring集成的特殊處理 5. 各版本的差異對比 6. 完整的代碼示例片段 7. 故障排查指南 8. 設計模式應用解析 需要擴展哪個部分可以告訴我,我可以提供更詳細的內容補充。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。