Mybatis框架學習總結

原文鏈接:https://www.cnblogs.com/xiaotie666/p/LiujinMybatisSummary.html

Mybatis是什麼?使用它我們可以做什麼?

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

MyBatis官網:http://mybatis.org
Github:https://github.com/mybatis

MyBatis環境搭建

這裏我們使用的編譯程序以Eclipse爲例。
下載jar包==>部署jar包==>編寫configuration核心配置文件==>創建pojo實體類==>創建DAO接口==>創建SQL映射文件==>編寫測試類

創建MyBatis核心配置文件configuration.xml

MyBatis核心配置文件主要用於配置數據庫連接和MyBatis運行時所需的各種特性,包含了設置和影響MyBatis行爲的屬性

在這裏插入圖片描述

MyBatis的核心接口和類

在這裏插入圖片描述
1)每個MyBatis的應用程序都以一個SqlSessionFactory對象的實例爲核心。
2)首先獲取SqlSessionFactoryBuilder對象,可以根據XML配置文件或Configuration類的實例構建該對象。
3)然後獲取SqlSessionFactory對象,該對象實例可以通過SqlSessionFactoryBuilder對象來獲得。
4)使用SqlSessionFactory對象獲取SqlSession實例。

SqlSessionFactoryBuilder
負責構建SqlSessionFactory,提供多個build()方法的重載,主要分爲三個:
build(Reader reader,String environment,Properties properties)
build(InputStream inputStream,String environment,Properties properties)
build(Configuration config)
最大的特點是用過即丟,一旦創建了SqlSessionFactory對象之後,這個類就不再需要存在了,因此SqlSessionFactoryBuilder的最佳作用範圍就是存在於方法體內,也就是局部變量。

SqlSessionFactory
相當於創建SqlSession實例的工廠,可以通過SqlSessionFactory提供的openSession()方法來獲取SqlSession實例。
SqlSessionFactory對象一旦創建,就會在整個應用運行過程中始終存在,沒有理由去銷燬或再創建它,並且在應用運行中也不建議多次創建SqlSession。因此SqlSessionFactory的最佳作用與是Application,即隨着應用的生命週期一同存在。這就是所謂的單例模式(指在應用運行期間有且僅有一個實例)。
這裏把SqlSessionFactory的代碼進行優化,最簡單的實現方式就是放在靜態代碼塊下:

在這裏插入圖片描述

這裏使用了ThreadLocal管理Mybatis中SqlSession對象,保證SqlSession在線程(準確的說是一次請求)中的唯一性。

SqlSession
SqlSession是用於執行持久化操作的對象,類似於JDBC中的Connection。它提供了面向數據庫執行SQL命令所需的所有方法,可以通過SqlSession實例直接運行已映射的SQL語句。

SqlSession對應着一次數據庫回話。由於數據庫會話不是永久的,因此SqlSession的生命週期也不應該是永久的。相反,在每次訪問數據庫時都需要創建它。
需要注意的是,每個線程都有自己的SqlSession實例,SqlSession實例不能被共享,也不是線程安全的。因此最佳的作用域範圍是request作用域或者方法體作用域內。
SqlSession的兩種使用方式
1)通過SqlSession實例來直接執行已映射的SQL語句。
2)基於mapper接口方式操作數據。(接口的方法必須與SQL映射文件中SQL語句的ID一一對應)

MyBatis核心配置文件

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

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

在這裏插入圖片描述
typeAliases元素
typeAliases元素的作用是配置類型別名,通過與MyBatis的SQL映射文件相關聯,減少輸入多餘的完整類名,以簡化操作。

environments元素
MyBatis可以配置多套運行環境,我們可以靈活選擇不同的配置,從而將SQL映射應用到不同的數據庫環境上。不管增加幾套運行環境,都必須要明確選擇出當前的唯一一個運行環境。

mappers元素
mappers:映射器,用來定義SQL的映射語句。

<mappers>
    <mapper resource="url">
</mappers>

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語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫。

MyBatis 中 #{} 和 ${} 的區別

#{}: 解析爲一個 JDBC 預編譯語句(prepared statement)的參數標記符,一個 #{ } 被解析爲一個參數佔位符 。
:stringSQL{}: 僅僅爲一個純碎的 string 替換,在動態 SQL 解析階段將會進行變量替換。以{}格式傳入入參後的執行sql打亂了我們的預期sql格式及查詢條件,從而實現sql注入。

使用${}的場景:
1 作爲in條件時,
2 參數爲int類型並且數據庫中字段的類型是number,
3 表名
4 order by ${},排序字段

其餘情況一般不使用 ${}。
簡單來說,就是能用 #{} 就不要用 ${}。

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