1. 什么是 MyBatis?
MyBatis?是一款優秀的?持久層框架,它通過 XML 或注解配置,將 Java 對象(POJO)與數據庫操作(SQL)進行靈活映射,簡化了 JDBC 的復雜操作。
-
核心思想:SQL 與代碼分離,開發者可專注 SQL 優化,同時享受 ORM(對象關系映射)的便捷。
-
定位:介于 JDBC 和全自動 ORM(如 Hibernate)之間的半自動化框架,靈活控制 SQL,適合復雜查詢和高性能場景。
2. 核心特性
特性 | 說明 |
---|---|
動態 SQL | 支持條件分支(<if> 、<choose> )、循環(<foreach> )等動態生成 SQL。 |
參數映射 | 自動將 Java 對象屬性映射到 SQL 參數(#{property} )。 |
結果集映射 | 將查詢結果自動封裝為 Java 對象(<resultMap> )。 |
緩存機制 | 提供一級緩存(SqlSession 級別)和二級緩存(Mapper 級別)。 |
插件擴展 | 支持自定義插件(如分頁、日志),通過攔截器修改 MyBatis 核心行為。 |
3. 核心組件
? ? 1.SqlSessionFactory
-
作用:創建 SqlSession 的工廠類,全局唯一,通常由?
SqlSessionFactoryBuilder
?解析配置文件生成。 -
配置來源:XML 文件(如?
mybatis-config.xml
)或 Java 代碼。
? ? 2.SqlSession
-
作用:執行 SQL 操作、獲取 Mapper 接口實例。非線程安全,需確保每次請求單獨創建。
-
關鍵方法:
<T> T getMapper(Class<T> type); // 獲取 Mapper 接口實例 int insert(String statement, Object parameter); // 直接執行 SQL
? ? 3.Mapper 接口與 XML 映射文件
-
Mapper 接口:定義數據庫操作方法,方法名與 XML 中的 SQL ID 對應。
-
XML 映射文件:編寫 SQL 語句,配置參數/結果映射。
? ? 4.Executor
-
作用:SQL 執行器,處理緩存、事務、語句調度等核心邏輯。
-
類型:
SimpleExecutor
(默認)、ReuseExecutor
(重用預處理語句)、BatchExecutor
(批處理)。
4. 工作原理
-
配置加載:
-
解析?
mybatis-config.xml
,初始化數據源、事務管理器、Mapper 掃描路徑等。 -
加載 Mapper XML 文件或掃描 Mapper 接口,構建 SQL 映射關系。
-
-
SqlSession 創建:
-
通過?
SqlSessionFactory.openSession()
?創建 SqlSession,內部包含?Executor
?和事務控制。
-
-
SQL 執行流程:
-
Mapper 代理:通過動態代理(如?
MapperProxy
)將接口方法調用轉發給 SqlSession。 -
SQL 解析:根據方法名找到對應的 SQL 語句,處理動態標簽(如?
<if>
)。 -
參數處理:將 Java 對象轉換為 SQL 參數(
ParameterHandler
)。 -
SQL 執行:通過?
Executor
?執行 JDBC 操作,返回結果。 -
結果映射:將 ResultSet 轉換為 Java 對象(
ResultSetHandler
)。
-
5. 緩存機制
緩存級別 | 作用范圍 | 生命周期 | 開啟方式 |
---|---|---|---|
一級緩存 | SqlSession 級別 | 隨 SqlSession 關閉或清空 | 默認開啟 |
二級緩存 | Mapper 級別 | 應用生命周期,可跨 SqlSession 共享 | XML 中配置?<cache/> ?標簽開啟 |
6. 常見問題
-
MyBatis 與 Hibernate 的區別?
-
MyBatis:半自動化,需手動寫 SQL,靈活控制細節。
-
Hibernate:全自動化,通過 HQL 操作對象,適合快速開發。
-
-
#{} 和 ${} 的區別?
-
#{}:預編譯參數(防 SQL 注入),如?
WHERE id = ?
。 -
**??:字符串替換(慎用),如動態表名‘ORDERBY??:字符串替換(慎用),如動態表名‘ORDERBY{column}`。
-
-
如何實現分頁?
-
物理分頁:使用插件(如 PageHelper)或數據庫方言(
LIMIT
)。 -
內存分頁:查詢全部數據后在代碼中分頁(不推薦)。
-
7. 總結
-
優勢:靈活控制 SQL、動態 SQL 強大、性能優化空間大。
-
適用場景:復雜查詢、需深度優化 SQL、對數據庫訪問有精細控制需求的項目。
-
學習路徑:掌握 XML/注解配置 → 理解動態 SQL → 熟悉緩存機制 → 整合 Spring/Spring Boot。