Mybatis 常用的標籤以及動態SQL所用到的標籤

1.背景介紹

MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼如參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和JavaBean映射成數據庫中的記錄。

每個MyBatis應用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。

Mybatis的特點:

簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單的安裝只要兩個jar文件+配置幾個sql映射文件。

靈活:mybatis不會對應用程序或者數據庫的現有設計強加任何影響。 sql寫在xml裏,便於統一管理和優化。

解除sql與程序代碼的耦合:通過提供DAL層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。

半自動映射框架:其被稱爲半自動是因爲需要手工配置POJO,sql和映射關係,所有的功能通過編寫SQL來實現。

提供了對底層JDBC數據訪問的封裝

提供強大的數據映射功能(傳入參數映射和結果數據映射)

Mybtais運行的總體流程

(1)加載配置並初始化

觸發條件:加載配置文件

處理過程:將SQL的配置信息加載成爲一個個MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。

這裏說下,一個MappedStatement對象對應Mapper配置文件中的一個select/update/insert/delete節點,主要描述的是一條SQL語句。

(2)接收調用請求

觸發條件:調用Mybatis提供的API

傳入參數:SQL的ID和傳入參數對象

處理過程:將請求傳遞給下層的請求處理層進行處理。

(3)處理操作請求

觸發條件:API接口層傳遞請求過來

傳入參數:SQL的ID和傳入參數對象

處理過程:(A)根據SQL的ID查找對應的MappedStatement對象。(B)根據傳入參數對象解析MappedStatement對象,得到最終要執行的SQL和執行傳入參數。©獲取數據庫連接,根據得到的最終SQL語句和執行傳入參數到數據庫執行,並得到執行結果。(D)根據MappedStatement對象中的結果映射配置對得到的執行結果進行轉換處理,並得到最終的處理結果。(E)釋放連接資源。

(4)返回處理結果:

將操作數據庫的結果按照映射的配置進行轉換,可以轉換成HashMap、JavaBean或者基本數據類型,並將最終結果返回。

2.知識剖析

1.mybatis配置文件

2.動態SQL語句

配置文件標籤

1、Properties屬性:用來加載屬性配置文件。

Mybatis將按照下面的順序來加載屬性:

(1) 首先會讀取在property標籤中定義的屬性。   (2) 然後會讀取在properties標籤中通過resource或url加載時的屬性,它會覆蓋已讀取得同名屬性。   (3) 最後會讀取sql中parameterType傳遞過來的屬性,它會覆蓋已讀取的同名屬性。

因此,通過方法參數傳遞的屬性具有最高優先級,resource/url 屬性中指定的配置文件次之,最低優先級的是 properties 屬性中指定的屬性。

2、settings全局參數配置:Mybatis框架在運行時可以調整一些運行參數,比如:開啓二級緩存、開啓延遲加載等。

3、typeAliases類型別名:類型別名是爲 Java 類型設置一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減少類完全限定名的冗餘。

4、配置環境(environments):MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 映射應用於多種數據庫之中,例如,開發、測試和生產環境需要有不同的配置;

不過:儘管可以配置多個環境,每個 SqlSessionFactory 實例只能選擇其一。所以,如果我們想連接兩個數據庫,就需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個。

爲了指定創建哪種環境,只要將它作爲可選的參數傳遞給 SqlSessionFactoryBuilder 即可。可以接受環境配置的兩個方法簽名是:

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);

如果忽略了環境參數,那麼默認環境將會被加載。

5、事務管理器(transactionManager)

在 MyBatis 中有兩種類型的事務管理器(也就是 type=”[JDBC|MANAGED]”):

JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設置,它依賴於從數據源得到的連接來管理事務作用域。MANAGED – 這個配置幾乎沒做什麼。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命週期(比如 JEE 應用服務器的上下文)。 默認情況下它會關閉連接,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設置爲 false 來阻止它默認的關閉行爲。

6、typeHandlers類型處理器

無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,還是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型。即專門用來解決數據庫中的數據類型和Java中的數據類型之間的轉化問題。

mybatis有一系列的默認的類型處理器,所以在平時開發的時候我們不用去關心java到數據庫的類型轉化關係,mybatis都幫我們把這些工作完成了。當然我們也可以重寫類型處理器或創建你自己的類型處理器來處理不支持的或非標準的類型。

動態SQL語句

MyBatis 的強大特性之一便是它的動態 SQL。mybatis 的動態sql語句是基於OGNL表達式的。可以方便的在 sql 語句中實現某些邏輯. 總體說來mybatis 動態SQL 語句主要有以下幾類:

  1. if 語句 (簡單的條件判斷)

  2. choose (when,otherwize) ,相當於java 語言中的 switch

  3. trim :

(1)只有prefix,suffix 表示在trim標籤包裹的部分的前面或者後面添加內容

(2)只有prefixOverrides,suffixOverrides 表示刪除

  1. where (主要是用來簡化sql語句中where條件判斷的,能智能的處理 and /or ,不必擔心多餘導致語法錯誤)

  2. set (主要用於更新時):

1)、程序執行時,將生成set關鍵字

2)、會過濾掉最後一個update語句的","

  1. foreach (在實現 mybatis in 語句查詢時特別有用)

1)、collection表示如何來得到這個集合,如果傳入的直接爲一個List,那麼collection值就爲list。

2)、item表示集合中每一個元素進行迭代時的別名,比如item爲value,那麼,每次獲取的都使用#{value}即可

3)、index指定一個名字,用於表示在迭代過程中,每次迭代到的位置

4)、open表示該語句以什麼開始

5)、separator表示在每次進行迭代之間以什麼符號作爲分隔符

6)、close表示以什麼結束

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