首頁>技術>

MyBatis概述

在開始一個專案的原始碼閱讀之前,首先要對整個專案有較為全面的瞭解。需要了解的資訊包括專案的產生背景、演進過程、使用方法等,這些資訊能夠幫助我們直觀地勾勒整個專案的外在輪廓。這樣,在我們遇到一段程式碼時就能根據外在輪廓更好地揣測它在整體功能中的作用,最大限度地減少理解偏差。

在本章我們將概括性地瞭解 MyBatis專案,包括其背景介紹、快速上手方法等,而對於一些更為細節的使用方法,將會在相關部分的原始碼解析時進行介紹。

背景介紹

傳統資料庫連線

資料庫是軟體專案中儲存持久化資料最常用的場所,應用十分廣泛。例如,在網站應用中,註冊使用者的資訊、頁面展示的資訊、使用者提交的資訊等大都是儲存在資料庫中的。因此,與資料庫進行互動是很多軟體專案中非常重要的部分。

然而,軟體程式與資料庫互動的過程需要建立連線、拼裝和執行 SQL語句、轉化操作結果等步驟,相對比較繁瑣。程式碼2-1是一個從資料庫中查詢 User列表的示例。

【程式碼2-1】

程式碼2-1 所示的過程中,第一、二、五步的工作是相對固定的,可以透過封裝函式進行統一操作;而第三、四步的操作卻因為涉及的輸入引數和輸出引數的 Java物件不同而很難將其統一起來。不僅是在資料的查詢操作中,在資料的寫入、編輯操作中也會面臨同樣的問題。在進行資料寫入和編輯操作時往往需要處理更多的輸入引數,需要將這些引數一一拼裝到 SQL語句內。

隨著 SQL語句及輸入引數、輸出引數物件的不同,上述程式碼中第三、四步展示的操作會千變萬化,我們只能針對不同物件的不同操作拼裝不同的操作語句,然後單獨處理返回的結果。資料庫寫入、讀取操作是十分頻繁的,這就帶來了大量煩瑣的工作。

ORM框架就是為解決上述問題而產生的。

ORM框架

在目前主流的軟體開發過程中,多使用面向物件的開發方法和基於關係型資料庫的持久化方案。

面向物件是在軟體工程原則(如聚合、封裝)的基礎上發展起來的,而關係型資料庫則是在數學理論(集合代數等)的基礎上發展起來的,兩者並不是完全匹配的,它們中間需要資訊的轉化。例如,在將物件持久化到關係型資料庫中時常常需要圖2-1所示的轉化過程。

圖2-1 物件和關係的對映

這樣的轉化稱為物件關係對映(Object Relational Mapping,簡稱 ORM、O/RM或 O/R mapping)。ORM 會在資料庫資料的讀取和寫入操作過程中頻繁發生,為了降低這種轉化過程的開發成本,產生了大量的ORM框架,MyBatis就是其中非常出色的一款。

MyBatis的特點

大多數 ORM框架選擇將 Java物件和資料表直接關聯起來,用一組對應關係將兩者繫結在一起。物件和資料表的對映如圖2-2所示。

圖2-2 物件和資料表的對映

MyBatis則採取了另一種方式,它沒有將 Java物件和資料表直接關聯起來,而是將 Java方法和 SQL語句關聯起來。這使得 MyBatis在簡化了 ORM操作的同時,也支援了資料表的關聯查詢、檢視的查詢、儲存過程的呼叫等操作。除此之外,MyBatis 還提供了一種對映機制,將 SQL語句的引數或結果與物件關聯起來。圖2-3形象地展示了 MyBatis的對映機制。

圖2-3 MyBatis的對映機制

這樣,使用 MyBatis時,只要呼叫一個方法就可以執行一條複雜的SQL語句。在呼叫方法時可以給方法傳遞物件作為 SQL語句的引數,而SQL語句的執行結果也會被對映成物件後返回。因此,關係型資料庫被MyBatis遮蔽了,讀寫資料庫的過程成了一個純粹的面向物件的過程。

除核心對映功能外,MyBatis 還提供了快取功能、懶載入功能、主鍵自增功能、多資料集處理功能等,這些功能的實現原理會在後續的原始碼閱讀中詳細介紹。

快速上手

在這一節中我們將搭建並執行一個包含 MyBatis的專案,從而對 MyBatis的功能建立直觀的認識。

MyBatis的使用非常靈活,支援多種配置方式:

· 完全程式碼配置。MyBatis 提供完整的配置類,使用者可以呼叫這些配置類完成所有配置工作。但是使用這種配置方式會使得配置資訊和業務程式碼混雜在一起,因此很少採用。

· 基於 XML的配置。MyBatis提供使用 XML進行配置的功能。這種配置方式簡單明瞭,經常使用。· 外部框架配置。因為 Spring、Spring Boot等框架非常流行,MyBatis開發團隊也開發了與這些框架進行對接的相關元件。有了這些元件的支援,可以在 Spring、Spring Boot中直接實現 MyBatis的一些簡單配置。

下面將基於 Spring Boot來快速配置一個包含 MyBatis的專案。Spring Boot是一個可以快速上手的 Spring 框架,它能夠幫助開發者在配置極少的情況下快速建立輕量、易用的Spring 應用。並且 Spring Boot 還提供一個快速生成初始化專案的網站 Spring Initializr:https://start.spring.io/,如圖2-4所示。

圖2-4 Spring Initializr網站

在 Spring Initializr網站中,設定好專案的 Group名稱、Artifact名稱及專案依賴後,就可以直接將一個初始化好的專案包下載到本地。在快速上手專案中,需要的專案依賴有:

· MyBatis Framework:提供 MyBatis及其與 Spring Boot對接的元件。

· MySQL Driver:提供連線 MySQL資料庫的驅動。

· Spring Web:提供基本的 Web訪問功能。

MyBatis包的引入

觀察使用 Spring Initializr初始化的專案,可能會有人疑惑其 POM中沒有引用 mybatis包。這是因為引用了 mybatis-spring-boot-starter包,如程式碼2-2所示。

【程式碼2-2】

開啟 mybatis-spring-boot-starter的 POM檔案,如程式碼2-3所示,就可以發現這裡不僅引用了 mybatis包,還引用了 mybatis-spring、mybatis-spring-boot-autoconfigure等包。

【程式碼2-3】

mybatis-spring-boot-starter 的 POM 檔案中並沒有定義 mybatis 包的版本,這是因為mybatis包的版本是在 mybatis-spring-boot-starter的祖父包 mybatis-parent中定義的,如程式碼2-4所示。

【程式碼2-4】

所以,只要引用了 mybatis-spring-boot-starter包,就間接引用了 mybatis包及其他的一些元件包。

MyBatis的簡單配置

首先,在 Spring Boot 的配置檔案中設定應用服務埠號,以及要連線的資料庫的地址、使用者名稱、密碼資訊,如程式碼2-5所示。

【程式碼2-5】

使用了 mybatis-spring-boot-starter包之後,可以省略 MyBatis的配置檔案,只需建立對映檔案即可。建立的對映檔案如程式碼2-6所示。

【程式碼2-6】

這樣,MyBatis的所有配置就完成了。

基於MyBatis的資料庫操作

為了讓 MyBatis能夠完成 ORM的轉化工作,首先在示例專案中建立一個模型類,如程式碼2-7所示。

【程式碼2-7】

然後,建立一個與對映檔案相對應的對映介面檔案,如程式碼2-8 所示。這裡一定不要忘記新增@Mapper註解,正是這個註解聲明瞭該類是一個對映介面。

【程式碼2-8】

最後,建立一個接收網路請求並透過 MyBatis 進行資料庫訪問的控制器,如程式碼2-9所示。

【程式碼2-9】

這樣,整個示例專案就搭建完成了。最終的專案檔案結構如圖2-5所示。

圖2-5 專案檔案結構

這樣,所有的設定工作就全部完成了。啟動該 Spring Boot專案後,使用瀏覽器訪問該服務的埠,即可在瀏覽器和控制檯看到資料庫查詢結果,如圖2-6所示。

圖2-6 資料庫查詢結果

MyBatis的核心功能分析

在快速上手示例中,只使用了下面一行程式碼便完成了資料庫的查詢操作。在這行程式碼中,不包含 SQL語句,接收的引數是 Java物件,輸出的結果是 Java物件列表。

而 2.1.1節中所介紹的直接使用 JDBC操作資料庫的程式碼如程式碼2-10所示。

【程式碼2-10】

可以看出,使用 MyBatis後大大簡化了資料庫的讀寫操作。其原因是,在該配置下,MyBatis完成了下面的對映關係:

· 對映檔案中的 SQL語句與對映介面中的抽象方法建立了對映。

示例中,SQL語句“SELECT*FROM`user`WHERE schoolName=#{schoolName}”對應了“List<User>queryUserBySchoolName(User user)”方法。

· SQL 語句的輸入引數與方法輸入引數建立了對映。示例中,SQL語句中的“#{schoolName}”引數對應了方法輸入引數 User物件的 schoolName屬性。

· SQL語句的輸出結果與方法結果建立了對映。示例中,SQL語句的輸出結果對應了User物件。

這種對映關係也可以用圖2-7表示。

圖2-7 對映關係

以上對映之間的轉化工作是在資料庫讀寫過程中由 MyBatis自動完成的。因此,可以總結出 MyBatis完成的主要工作,這些工作就是 MyBatis的核心功能。

· 將包含 if等標籤的複雜資料庫操作語句解析為純粹的 SQL語句。

· 將資料庫操作節點和對映介面中的抽象方法進行繫結,在抽象方法被呼叫時執行資料庫操作。

· 將輸入引數物件轉化為資料庫操作語句中的引數。

· 將資料庫操作語句的返回結果轉化為物件。

在接下來的原始碼閱讀中,把握住 MyBatis的核心功能,並重點關注與核心功能相關的程式碼,可以使我們在面對紛雜的類和方法時不易迷失。

在其他專案的原始碼閱讀中,也要遵循這樣的策略:找出軟體專案的核心功能,重點關注與核心功能相關的程式碼。

10
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Element-UI 死而復生,基於Vue3.0的版本來了