關於mybatis框架的總結

MyBatis是一個開源的數據持久層框架,它內部封裝了通過JDBC訪問數據庫的操作,支持普通的SQL查詢、存儲過程和高級映射,幾乎消除了所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis作爲持久層框架,其主要思想是將程序中大量SQL語句剝離出來,配置在配置文件中,實現SQL的靈活配置。這樣做的好處是將SQL與程序代碼分離,可以在不修改程序代碼的情況下,直接在配置文件中修改SQL。Mybatis通過簡單的XML或者註解進行配置和原始映射,將實體類和SQL語句之間建立映射關係,是一種半自動化的ORM實現。

MyBatis核心配置文件主要用於配置數據庫連接和MyBatis運行時所需的各種特性,包含了設置和影響MyBatis行爲的屬性。
1)每個MyBatis的應用程序都以一個SqlSessionFactory對象的實例爲核心。
2)首先獲取SqlSessionFactoryBuilder對象,可以根據XML配置文件或
Configuration類的實例構建該對象。
3)然後獲取SqlSessionFactory對象,該對象實例可以通過SqlSessionFactoryBuilder對象來獲得。
4)使用SqlSessionFactory對象獲取SqlSession實例。

MyBatis核心配置文件
properties元素
properties元素描述的都是外部化,可替代的屬性。有以下兩種方式實現:
1)可通過外部指定的方式,即配置在典型的Java屬性配置文件中,並使用這些屬性對配置項實現動態配置。
2)直接配置爲xml,並使用這些屬性對配置項實現動態配置。

settings元素
settings元素的作用是設置一些非常重要的設置選項,用於設置和改變
MyBatis運行中的行爲。

mappers元素
mappers:映射器,用來定義SQL的映射語句。
1)使用類資源路徑獲取資源
2)使用URL獲取資源

SQL映射文件
下面是關於SQL映射文件的幾個頂級元素:
mapper:映射文件的根元素節點,只有一個屬性namespace(命名空間),作用:
  用於區分不同的mapper,全局唯一。
  綁定DAO接口,即面向接口編程。當namespace綁定某一接口之後,可以不用寫該接口的實體類,MyBatis會通過接口的完整限定名查找到對應的mapper配置來執行SQL語句。因此namespace的命名必須要和接口同名。
cache:配置給定命名空間的緩存。(性能較低,不推薦使用)
cache-ref:從其他命名空間引用緩存配置。
resultMap:用來描述數據庫結果集和對象的對應關係。
sql:可以重用的SQL塊,也可以被其他語句引用。
insert:映射插入語句。
update:映射更新語句。
delete:映射刪除語句。
select:映射查詢語句。

namespace的命名必須跟某個DAO接口同名,通屬於DAO層,所以映射文件與該DAO接口應放置在同一package下。
在不同的mapper文件中,子元素的id可以相同,MyBatis通過namespace和子元素的id聯合區分。接口中的方法與映射文件中的SQL語句id應一一對應。
resultType
resultType直接表示返回類型,包括基礎數據類型和複雜數據類型。
resultMap
id屬性:唯一標識,此id值用於select元素的resultMap屬性的引用。
type屬性:表示該resultMap的映射結果類型。
result子節點:用於標識一些簡單屬性,其中column屬性表示從數據庫中查詢的字段名,property則表示查詢出來的字段對應的值賦給實體對象的哪個屬性。
resultMap是對外部resultMap定義的引用,對應外部resultMap的id,表示返回結果映射到某一個resultMap上。主要應用:數據庫字段信息與對象屬性不一致或者需要做複雜的聯合查詢以便自由控制映射結果。
resultType和resultMap本質上是一樣的,都是Map數據結構。但是不能同時存在,只是二者選其一使用。
association
association:映射到JavaBean的某個複雜類型屬性,即JavaBean內部嵌套一個複雜數據類型屬性。association僅處理一對一的關聯關係。
屬性:
javaType:完整Java類名或者別名。
property:映射數據庫列的實體對象的屬性。
id
result:
  property:映射數據庫列的實體對象的屬性。
  column:數據庫列名或別名。
collection
collection元素的作用和association元素的作用類似,只不過collection元素映射的屬性是一個集合列表,即JavaBean內部嵌套一個複雜數據類型(集合)屬性。
屬性:
ofType:完整Java類型或者別名,即集合所包含的類型。
property:映射數據庫列的實體對象的屬性。
collection的子元素與association基本一致。
resultMap自動映射級別
在MyBatis核心配置文件中添加標籤:

MyBatis對resultMap自動映射有三個匹配級別:
NONE:禁止自動匹配。
PARTIAL(默認):自動匹配所有屬性,有內部嵌套(association、collection)的除外。
FULL:自動匹配所有。

使用動態SQL完成多條件查詢
if:利用if實現簡單的條件選擇。
choose(when,otherwise):相當於Java中的switch,通常與when和otherwise搭配。
where:簡化SQL語句中where的條件判斷,並能智能地處理and和or,不必擔心多餘關鍵字導致的語法錯誤。
set:解決動態更新語句。主要功能和where類似,是在包含的語句前輸出一個set,若包含的語句是以逗號結束的,會自動把該逗號忽略掉,再配合if元素就可以動態地更新需要修改的字段。
trim:可以靈活地去除多餘的關鍵字。

屬性:
prefix:前綴,作用是通過自動識別是否有返回值後,在trim包含的內容上加上前綴。
suffix:後綴,作用是在trim包含的內容上加上後綴。
prefixOverrides:對於trim包含的首部進行指定內容的忽略。
suffixOverrides:對於trim包含內容的首尾部進行指定內容的忽略。
foreach:迭代一個集合,通常用於in條件。foreach主要用在構建in條件中,它可以在SQL語句中迭代一個集合。
屬性:
item:表示集合中每一個元素進行迭代時的別名。
index:指定一個名稱,用於表示在迭代過程中,每次迭代到的位置。
open:表示該語句以什麼開始。(如果是in條件語句,以“(”開始)
separator:表示在每次進行迭代之間以什麼符號作爲分隔符。(如果是in條件語句,以“,”作爲分隔符)
close:表示該語句以什麼結束。(如果是in條件語句,以“)”結束)
collection:該屬性必須指定,不同情況下,該屬性的值是不一樣的。主要有三種情況:
  若入參爲單參數且參數類型是一個List的時候,collection屬性值爲list。
  若入參爲單參數且參數類型是一個數組的時候,collection屬性值爲array。
  若傳入參數爲多參數,就需要把它們封裝爲一個Map進行處理。

MyBatis框架的優點:
1)與JDBC相比,減少了50%以上的代碼量。
2)MyBatis是最簡單的持久化框架,小巧並且簡單易學。
3)MyBatis相當靈活,不會對應用程序或者數據庫的現有設計強加任何影響,SQL寫在XML裏,從程序代碼中徹底分離,降低耦合度,便於統一管理和優化,並可重用。
4)提供XML標籤,支持編寫動態SQL語句。
5)提供映射標籤,支持對象與數據庫的ORM字段關係映射。
MyBatis框架的缺點:
1)SQL語句的編寫工作量較大,對開發人員編寫SQL語句的功底有一定要求。
2)SQL語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章