MyBatis 入門介紹
本文更新日期:2022年11月26日
1、什么是 MyBatis?
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。
MyBatis 本是Apache的一個開源項目 iBatis ,2010年這個項目由 Apache Software Foundation 遷移到了Google Code,并且改名為 MyBatis ,三年之后,MyBatis 于 2013年11月遷移到 Github,最終一直扎根于 Github,并開枝散葉,發展壯大。

1.1、什么是持久化?
持久化,可以理解成數據保存在數據庫或者硬盤一類可以保存很長時間的設備里面,不像放在內存中那樣斷電就消失了。
1.2、什么是持久層?
持久層,就是在系統邏輯層面上,專注于實現數據持久化的一個相對獨立的領域,是把數據保存到數據庫等存儲設備中。在Java領域,最常見的持久層框架有兩個:Hibernate和MyBatis。
1.3、什么是ORM?
ORM,即Object-Relationl Mapping,它的作用是在關系型數據庫和對象之間作一個映射,這樣,我們在具體的操作數據庫的時候,就不需要再去和復雜的SQL語句打交道,只要像平時操作對象一樣操作它就可以了 。
1.4、為什么要做持久化和ORM設計?
在目前的企業應用系統設計中,一般采用MVC的分層開發模式,即 Model(模型)- View(視圖)- Control(控制)為主要的系統架構模式。
MVC 中的 Model 包含了復雜的業務邏輯和數據邏輯,以及數據存取機制,例如 JDBC的連接、SQL生成和Statement創建、還有ResultSet結果集的讀取等等。將這些復雜的業務邏輯和數據邏輯分離,可以使系統的緊耦合關系轉化為松耦合關系,從而降低系統耦合度,這是持久化要做的工作。
MVC 模式實現了表現層(即View)和數據處理層(即Model)的分離和解耦,而持久化的設計則實現了數據處理層內部的業務邏輯和數據邏輯分離的解耦合。
而ORM 作為持久化設計中的最重要也最復雜的技術,也是目前業界熱點技術。
簡單來說,按通常的系統設計,使用 JDBC 操作數據庫,業務處理邏輯和數據存取邏輯是混雜在一起的。一般基本都是如下幾個步驟:
- 1、建立數據庫連接,獲得 Connection 對象。
- 2、根據用戶的輸入組裝查詢 SQL 語句。
- 3、根據 SQL 語句建立 Statement 對象 或者 PreparedStatement 對象。
- 4、用 Connection 對象執行 SQL語句,獲得結果集 ResultSet 對象。
- 5、然后一條一條讀取結果集 ResultSet 對象中的數據。
- 6、根據讀取到的數據,按特定的業務邏輯進行計算。
- 7、根據計算得到的結果再組裝更新 SQL 語句。
- 8、再使用 Connection 對象執行更新 SQL 語句,以更新數據庫中的數據。
- 7、最后依次關閉各個 Statement 對象和 Connection 對象。
由上可看出,代碼邏輯非常復雜,這還不包括某條語句執行失敗的處理邏輯。其中的業務處理邏輯和數據存取邏輯完全混雜在一塊。而一個完整的系統要包含成千上萬個這樣重復的而又混雜的處理過程,假如要對其中某些業務邏輯或者一些相關聯的業務流程做修改,要改動的代碼量將不可想象。
另一方面,假如要換數據庫產品或者運行環境也可能是個不可能完成的任務。而用戶的運行環境和要求卻千差萬別,我們不可能為每一個用戶每一種運行環境設計一套一樣的系統。
所以就要將一樣的處理代碼即業務邏輯和可能不一樣的處理即數據存取邏輯分離開來,另一方面,關系型數據庫中的數據基本都是以一行行的數據進行存取的,而程序運行卻是一個個對象進行處理,而目前大部分數據庫驅動技術(如ADO.NET、JDBC、ODBC等等)均是以行集的結果集一條條進行處理的。所以為解決 這一困難,就出現 ORM 這一個對象和數據之間映射技術。
2、Hibernate和MyBatis的區別
2.1、Hibernate 介紹
Hibernate 是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。
2.2、MyBatis 與 Hibernate 的區別
Hibernate 會自動生成SQL 語句,而MyBatis則要求開發者編寫具體的SQL 語句。相對Hibernate等全自動ORM機制而言,MyBatis 以SQL開發的工作量和數據庫移植性上的讓步,為系統設計提供了更大的自由空間。作為全自動ORM 實現的一種有益補充,MyBatis 的出現顯得別具意義。
3、MyBatis的工作原理
3.1、傳統的JDBC編程
JAVA程序通過JDBC鏈接數據庫,這樣我們就可以通過SQL對數據庫進行編程。JAVA鏈接數據庫大致分為五步,如下所示:
- 1、使用JDBC編程需要鏈接數據庫,注冊驅動和數據庫信息。
- 2、操作Connection,打開Statement對象。
- 3、通過Statement執行SQL語句,返回結果放到ResultSet對象。
- 4、使用ResultSet讀取數據。
- 5、關閉數據庫相關的資源。
JDBC 代碼示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class JdbcDemo{
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String username = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
Connection conn = DriverManager.getConnection(url,username,password);
String sql = "insert into t_person values('Tom', 25, '138xxxxxxxx', '北京');";
PreparedStatement pstm = conn.prepareStatement(sql);
int update = pstm.executeUpdate();
System.out.println(update);
pstm.close();
conn.close();
}
}
傳統的JDBC方式存在一些弊端:
(1)工作量比較大。我們需要先建立鏈接,然后處理JDBC底層業務,處理數據類型。我們還需要處理Connection對象,Statement對象和Result對象去拿數據,并關閉它們。
(2)我們對JDBC編程處理的異常進行捕獲處理并正確的關閉資源。
3.2、MyBatis工作原理:對JDBC進行了封裝
首先我們先了解一下MyBatis的四大核心組件:
- 1、SQLSessionFactoryBuilder(構造器):它會根據配置信息或者代碼生成SqlSessionFactory。
- 2、SqlSessionFactory(工廠接口):依靠工廠生成SqlSession。
- 3、SqlSession(會話):是一個既可以發送SQL去執行并且返回結果,也可以獲取Mapper接口。
- 4、SQL Mapper:是由一個JAVA接口和XML文件(或注解)構成,需要給出對應的SQL和映射規則。SQL是由Mapper發送出去,并且返回結果。
MyBatis工作原理示意圖:

從上面的流程圖可以看出MyBatis和JDBC的執行時相似的。MyBatis的底層操作封裝了JDBC的API,MyBatis的工作原理以及核心流程與JDBC的使用步驟一脈相承,MyBatis的核心對象(SqlSession,Executor)與JDBC的核心對象(Connection,Statement)相互對應。
4、MyBatis的優點
MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。MyBatis是對JDBC的封裝。相對于JDBC,MyBatis有以下優點:
(1)SQL統一管理,對數據庫進行存取操作。
我們使用JDBC對數據庫進行操作時,SQL查詢語句分布在各個Java類中,這樣可讀性差,不利于維護,當我們修改Java類中的SQL語句時要重新進行編譯。Mybatis可以把SQL語句放在配置文件中統一進行管理,以后修改配置文件,也不需要重新就行編譯部署。
(3)生成動態SQL語句。
我們在查詢中可能需要根據一些屬性進行組合查詢,比如我們進行商品查詢,我們可以根據商品名稱進行查詢,也可以根據發貨地進行查詢,或者兩者組合查詢。如果使用JDBC進行查詢,這樣就需要寫多條SQL語句。Mybatis可以在配置文件中通過使用<if test=””></if>
標簽進行SQL語句的拼接,生成動態SQL語句。
(3)能夠對結果集進行映射。
我們在使用JDBC進行查詢時,返回一個結果集ResultSet,我們要從結果集中取出結果封裝為需要的類型。在Mybatis中,我們可以設置將結果直接映射為自己需要的類型,比如:JavaBean對象、一個Map、一個List等等。