MyBatis基礎學習:動態SQL和SQL語句構建器類

Mybatis介紹

MyBatis logo

MyBatis(http://www.mybatis.org/) 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 能夠對配置和原生Map使用簡單的 XML 或註解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。java

 

動態 SQL

做用程序員

MyBatis 的強大特性之一即是它的動態 SQL。若是你有使用 JDBC 或其餘相似框架的經驗,你就能體會到根據不一樣條件拼接 SQL 語句有多麼痛苦。拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最後的逗號。利用動態 SQL 這一特性能夠完全擺脫這種痛苦。數據庫

一般使用動態 SQL 不多是獨立的一部分,MyBatis 固然使用一種強大的動態 SQL 語言來改進這種情形,這種語言能夠被用在任意的 SQL 映射語句中。mybatis

動態 SQL 元素和使用 JSTL 或其餘相似基於 XML 的文本處理器類似。在 MyBatis 以前的版本中,有不少的元素須要來了解。MyBatis 3 大大提高了它們,如今用不到原先一半的元素就能夠了。MyBatis 採用功能強大的基於 OGNL 的表達式來消除其餘元素。框架

 

if

動態 SQL 一般要作的事情是有條件地包含 where 子句的一部分。好比:ide

<select id="select" resultType="User">
  SELECT * FROM User WHERE uid=#{uid} 
  <if test="name != null">
    AND name=#{name}
  </if>
</select>

 

choose (when, otherwise)

有些時候,咱們不想用到全部的條件語句,而只想從中擇其一二。針對這種狀況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。工具

<select id="find" resultType="User">
  SELECT * FROM User WHERE uid=#{uid}
  <choose>
    <when test="name != null">
      AND name=#{name}
    </when>
    <when test="age != null">
      AND age=#{age}
    </when>
    <otherwise>
      AND age=0
    </otherwise>
  </choose>
</select>

 

trim (where, set)

咱們能夠經過自定義 trim 元素來定製咱們想要的功能。好比:學習

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ... 
</trim>

prefixOverrides 屬性會忽略經過管道分隔的文本序列(注意此例中的空格也是必要的)。它帶來的結果就是全部在 prefixOverrides 屬性中指定的內容將被移除,而且插入 prefix 屬性中指定的內容。ui

 

foreach

動態 SQL 的另一個經常使用的必要操做是須要對一個集合進行遍歷。好比:spa

<insert id="insert" parameterType="User">
    INSERT INTO User (
      <include refid="baseColums"/>
    ) VALUES
    <foreach item="item" collection="list" separator=",">
        (#{item.name}, #{item.age})
    </foreach>
</insert>

foreach 元素的功能是很是強大的,它容許你指定一個集合,聲明能夠用在元素體內的集合項和索引變量。它也容許你指定開閉匹配的字符串以及在迭代中間放置分隔符。這個元素是很智能的,所以它不會偶然地附加多餘的分隔符。

 

SQL語句構建器類

做用

Java程序員面對的最痛苦的事情之一就是在Java代碼中嵌入SQL語句。這麼來作一般是因爲SQL語句須要動態來生成-不然能夠將它們放到外部文件或者存儲過程當中。正如你已經看到的那樣,MyBatis在它的XML映射特性中有一個強大的動態SQL生成方案。但有時在Java代碼內部建立SQL語句也是必要的。此時,MyBatis有另一個特性能夠幫到你,在減小典型的加號,引號,新行,格式化問題和嵌入條件來處理多餘的逗號或 AND 鏈接詞以前。

 

SQL類

MyBatis 3提供了方便的工具類來幫助解決該問題。使用SQL類,簡單地建立一個實例來調用方法生成SQL語句。好比:

private String selectPersonSql() {
  return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
    SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
    FROM("PERSON P");
    FROM("ACCOUNT A");
    INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
    INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
    WHERE("P.ID = A.ID");
    WHERE("P.FIRST_NAME like ?");
    OR();
    WHERE("P.LAST_NAME like ?");
    GROUP_BY("P.ID");
    HAVING("P.LAST_NAME like ?");
    OR();
    HAVING("P.FIRST_NAME like ?");
    ORDER_BY("P.ID");
    ORDER_BY("P.FULL_NAME");
  }}.toString();
}

 

SQL類方法和描述表

方法 描述
SELECT(String) 開始或插入到 SELECT子句。 能夠被屢次調用,參數也會添加到 SELECT子句。 參數一般使用逗號分隔的列名和別名列表,但也能夠是數據庫驅動程序接受的任意類型。
SELECT_DISTINCT(String) 開始或插入到 SELECT子句, 也能夠插入 DISTINCT關鍵字到生成的查詢語句中。 能夠被屢次調用,參數也會添加到 SELECT子句。 參數一般使用逗號分隔的列名和別名列表,但也能夠是數據庫驅動程序接受的任意類型。
FROM(String) 開始或插入到 FROM子句。 能夠被屢次調用,參數也會添加到 FROM子句。 參數一般是表名或別名,也能夠是數據庫驅動程序接受的任意類型。
  • JOIN(String)
  • INNER_JOIN(String)
  • LEFT_OUTER_JOIN(String)
  • RIGHT_OUTER_JOIN(String)
基於調用的方法,添加新的合適類型的 JOIN子句。 參數能夠包含由列命和join on條件組合成標準的join。
WHERE(String) 插入新的 WHERE子句條件, 由AND連接。能夠屢次被調用,每次都由AND來連接新條件。使用 OR() 來分隔OR。
OR() 使用OR來分隔當前的 WHERE子句條件。 能夠被屢次調用,但在一行中屢次調用或生成不穩定的SQL。
AND() 使用AND來分隔當前的 WHERE子句條件。 能夠被屢次調用,但在一行中屢次調用或生成不穩定的SQL。由於 WHERE 和 HAVING 兩者都會自動連接 AND, 這是很是罕見的方法,只是爲了完整性才被使用。
GROUP_BY(String) 插入新的 GROUP BY子句元素,由逗號鏈接。 能夠被屢次調用,每次都由逗號鏈接新的條件。
HAVING(String) 插入新的 HAVING子句條件。 由AND鏈接。能夠被屢次調用,每次都由AND來鏈接新的條件。使用 OR() 來分隔OR.
ORDER_BY(String) 插入新的 ORDER BY子句元素, 由逗號鏈接。能夠屢次被調用,每次由逗號鏈接新的條件。
DELETE_FROM(String) 開始一個delete語句並指定須要從哪一個表刪除的表名。一般它後面都會跟着WHERE語句!
INSERT_INTO(String) 開始一個insert語句並指定須要插入數據的表名。後面都會跟着一個或者多個VALUES()。
SET(String) 針對update語句,插入到"set"列表中
UPDATE(String) 開始一個update語句並指定須要更新的代表。後面都會跟着一個或者多個SET(),一般也會有一個WHERE()。
VALUES(String, String) 插入到insert語句中。第一個參數是要插入的列名,第二個參數則是該列的值。

 

總結

以上就是動態SQL和SQL語句構建器類的大體結構。經過對if元素、choose, when, otherwise元素、trim, where, set元素、foreach元素和SQL類的學習,對動態SQL和SQL語句構建器類有了一個總體的概念和理解。

相關文章
相關標籤/搜索