# MyBatis工作原理是什么
## 一、MyBatis概述
MyBatis是一款優秀的**持久層框架**,它通過XML或注解的方式將Java對象與SQL語句進行映射,避免了幾乎所有的JDBC代碼和手動參數設置。作為半自動ORM框架,MyBatis在SQL靈活性和開發效率之間取得了良好平衡,廣泛應用于Java企業級開發中。
## 二、核心架構組成
MyBatis的核心架構由以下幾個關鍵組件構成:
1. **SqlSessionFactory**(工廠類)
- 通過`SqlSessionFactoryBuilder`解析配置文件構建
- 線程安全,通常作為單例存在
- 負責創建SqlSession實例
2. **SqlSession**(會話對象)
- 包含執行SQL的所有方法
- 非線程安全,每次請求需新建實例
- 默認實現類:`DefaultSqlSession`
3. **Executor**(執行器)
- 實際執行SQL操作的組件
- 包含三種類型:
- SimpleExecutor:普通執行器
- ReuseExecutor:重用預處理語句
- BatchExecutor:批量操作
4. **MappedStatement**(映射語句)
- 存儲XML/注解配置的SQL信息
- 包含SQL語句、參數映射、結果映射等元數據
5. **TypeHandler**(類型處理器)
- 處理Java類型與JDBC類型的轉換
- 內置70+種常用類型處理器
- 支持自定義擴展
## 三、完整工作流程解析
### 1. 初始化階段
```java
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
mybatis-config.xml全局配置文件mapper.xml映射文件sequenceDiagram
participant Client
participant SqlSession
participant Executor
participant MappedStatement
participant JDBC
Client->>SqlSession: 獲取Mapper接口
SqlSession->>Executor: 創建代理對象
Executor->>MappedStatement: 獲取SQL配置
MappedStatement->>Executor: 返回參數映射
Executor->>JDBC: 執行SQL
JDBC->>Executor: 返回ResultSet
Executor->>TypeHandler: 結果集轉換
TypeHandler->>Client: 返回Java對象
<select id="findUsers" parameterType="map">
SELECT * FROM users
<where>
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
</where>
</select>
| 緩存級別 | 作用范圍 | 生命周期 | 配置方式 |
|---|---|---|---|
| 一級緩存 | SqlSession | 會話級 | 默認開啟 |
| 二級緩存 | Mapper | 應用級 |
注意事項: - 一級緩存可能導致臟讀 - 二級緩存需要序列化實現 - 分布式環境建議禁用或使用Redis等集中緩存
插件開發(Interceptor)
自定義類型處理器
@MappedTypes(PhoneNumber.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber> {
// 實現類型轉換邏輯
}
MyBatis通過精巧的架構設計,在保持SQL靈活性的同時提供了對象映射能力。理解其工作原理有助于: - 編寫高效Mapper配置 - 排查性能瓶頸 - 進行深度定制開發 - 正確處理事務邊界
隨著MyBatis 3.5+版本的迭代,對Java 8+特性的支持(如Optional)和Kotlin的兼容性使其在現代Java生態中繼續保持活力。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。