MyBatis知多少(4)MyBatis的優點

MyBatis是一個混合型解決方案。它汲取了全部這些解決方案中最有價值的思想並將它們融會貫通。下表總結了MyBatis從咱們以前討論的那些方案中所汲取的思想。html

相同的優勢 解決的問題
存儲過程 MyBatis對SQL進行了封裝和外部化使SQL從你 的應用程序代碼中分離出來。MyBatis具備與存儲 過程類似的API,但MyBatis的這些API是面向對象 的。MyBatis也徹底支持對存儲過程的直接調用 業務邏輯從數據庫中分離出來,應用程序更容易部署與測試,也具備更好的可移植性
內聯SQL MyBatis容許SQL以其最天然的方式書寫。沒有字符串拼接,沒有參數設置沒有結果獲取 MyBatis對應用程序代碼沒有任何影響。不須要任何預編譯器而且你可以徹底訪問 SQL的全部特性,而不僅是一個子集
動態SQL MyBatis提供了若干特性以支持基於參數的動態 構建査詢。不須要査詢構建工具」這樣的API MyBatis不要求SQL被寫成一堆字符串的拼接,中間還夾雜着應用程序的代碼
O/RM MyBatis支持許多與O/RM工具同樣的特性,例如 延遲加載、鏈接抓取、高速緩存、運行時代碼生成 以及繼承  MyBatis可用於任意數據模型與任意對象模型的組合。它對這二者中的任何一個的設 計沒有任何約束和要求

如今你已經理解MyBatis的根本思想了,接下來將討論MyBatis持久層所具備的兩個最重要的特性:外部化SQL和封裝SQL。這兩個概念展示了MyBatis框架的核心價值,並啓用了這個框 架所能實現的許多高級特性。數據庫

外部化的SQL編程

咱們能夠從過去的軟件開發中學習到的一條經驗就是「老是將一個大系統設計爲多個子系統,每一個子系統的功能都相對集中」。應該儘量地將那些須要由不一樣的開發角色處理的任務分離開,例如,用戶界面設計人員專職設計用戶界面,應用程序開發人員專職開發應用程序,數據庫管理人員專職管理數據庫。即便只有一我的來扮演全部這些角色,這種分離也可以使你擁有一個漂 亮的分層設計,使你老是能專一於系統的某個特定部分。若是將SQL嵌入到Java源代碼中,那麼這 些SQL對於數據庫管理人員或者對於使用相同數據庫的.NET開發人員來講就沒有任何用處。外部化將SQL從應用程序的源代碼中分離出來,從而使得二者都更加清晰。這樣作就保證了SQL語句與任何特定的語言或平臺都相對地獨立。大多數現代開發語言都將SQL表現爲一個字符串類型,這就 使得那些較長的SQL語句須要使用字符串拼接操做。考慮下面這個簡單的SQL語句:緩存

SELECT

PRODUCTID,

NAME,

DESCRIPTION,

CATEGORY                                             •

FROM PRODUCT

WHERE CATEGORY = ?

當在現代編程語言(例如Java)中嵌入一個這樣的字符串數據類型時,這個本來很簡單的SQL 語句就變成了一團「亂七八糟」的字符串,難以管理了。架構

String s = "SELECT"

+ " PRODUCTID,"

+ " NAME,"

+ " DESCRIPTION,"

+ " CATEGORY"

+ " FROM PRODUCT"

+ " WHERE CATEGORY = ?"

若是忘記在FROM子句前留一個空格,那麼就會引發SQL錯誤。很容易想象,若是你有一條複雜的SQL語句,那將會引發多大的麻煩。框架

這時MyBatis的一個主要優勢就體現出來了:使用MyBatis你就擁有按照最天然的方式書寫SQL 的能力。如下代碼讓你對經iBATIS映射後的SQL語句先有個感性認識:編程語言

SELECT

PRODUCTID,

NAME,

DESCRIPTION,

CATEGORY

FROM PRODUCT

WHERE CATEGORY = #categoryId#

注意該SQL不管是結構仍是簡單性都沒有變化。它與以前的SQL最大的不一樣之處就在於參數的格式變爲了#kategoryld#,這個格式一般是特定於語言的細節,MyBatis卻使得它易移植且更具可讀性。模塊化

如今咱們已經將SQL從源代碼中分離了出來,而且放在了一個能夠更天然地使用的地方,接 下來只要將它從新與咱們的軟件創建起鏈接,就能夠執行它了。函數

封裝化的SQL工具

計算機編程領域一個最古老的概念就是模塊化。在一個過程化的應用程序中,代碼可能被分 成許多文件、函數和過程。在面向對象的應用程序中,代碼經常被組織爲類和方法。封裝 (encapsulation)是模塊化的一種形式,它不只將代碼組織到一個內聚的模塊中,並且還將實現細 節隱藏了起來而僅僅向調用該類的代碼暴露出它的接口。

封裝的概念稍作擴展也能夠應用到持久層中。能夠經過定義SQL的輸入和輸出(例如它的界面)來封裝它,這樣應用程序的其餘部分就不須要知道具體的SQL語句了。若是你是一個面向對 象的軟件開發人員,那麼能夠像理解接口與實現的分離同樣來理解這種封裝。若是你是一個SQL 開發人員,那麼能夠像理解存儲過程對SQL的隱藏同樣來理解這種封裝。

MyBatis使用XML (extensible Markup Language,可擴展標記語言)來封裝SQL。因此選擇 XML是由於它具備很好的跨平臺性,而且獲得了行業內的普遍採用,還有就是XML可能會像SQL 同樣被長期使用下去,其生命可能會比其餘任何一種語言或文件格式都長。MyBatis使用XML映射SQL語句的輸入和輸出。大多數的SQL語句都會有一個或更多的參數,會產生一堆表格化的數 據做爲結果。或者說,結果被組織成了一系列的行和列。iBATIS容許你很容易地將輸入輸出參數 映射爲某些對象的特性(property)。以下例所示:

<select id=categoryByld"

parameterClass="string" resultClass="category">

SELECT CATEGORYID, NAME, DESCRIPTION

FROM CATEGORY

WHERE CATEGORYID = #categoryld#

注意包圍在SQL語句周圍的XML元素。這就是對SQL的封裝。這個簡單的<select>元素定 義了咱們的語句的名字、輸入參數類型以及輸出結果類型。對於一個面向對象的軟件開發人員來講,這就像是一個方法的簽名。

經過對SQL的外部化和封裝,咱們得到了簡單性和一致性。關於MyBatis的API如何使用以及SQL映射的語法細節,咱們將在後面討論。在此以前,咱們首先應該知道,在架構應用程序中,MyBatis到底應該用在哪裏,這很重要。

 

系列文章:

MyBatis知多少(1)

MyBatis知多少(2)

MyBatis知多少(3)

相關文章
相關標籤/搜索