標籤:

MyBatis 動態 SQL 常用功能

使用 jdbc 或類似的框架,動態拼接 SQL 是很痛苦的。比如根據當前日期選擇數據表、根據傳入的參數決定更新哪些欄位等,都是比較常用的動態查詢。MyBatis 擁有強大的動態 SQL 功能,可以在任何 SQL 語句中使用。MyBatis 的動態 SQL 主要使用以下幾個元素來實現:

  • 單一條件:if
  • 多個條件:choose, when, otherwise
  • 自動封裝:trim, where, set
  • 遍歷集合:foreach

if

if 用於檢測條件,動態包含 SQL 語句。例如下面的語句中,根據輸入的 title 是否為空來決定是否在查詢條件中增加 title 搜索條件。

<select id="select" resultType="Person"> SELECT * FROM Person WHERE state = 『ACTIVE』 <if test="title != null"> AND title like #{title} </if></select>

choose, when, otherwise

choose 元素提供了類似於 Java 語言中的 switch 功能,可以從多個選項中選擇一個加入 SQL 語句。

例如下面的語句,使用了兩個 when 和一個 otherwise,類似於 switch 中的 case 和 default。

<select id="select" resultType="Person"> SELECT * FROM Person WHERE state = 『ACTIVE』 <choose> <when test="title != null"> AND title like #{title} </when> <when test="sex != null"> AND sex = #{sex} </when> <otherwise> AND height = 170 </otherwise> </choose></select>

trim, where, set

trim 元素可以用於為 SQL 語句增加前綴、後綴,並去除指定的開頭和結尾。一共有四個屬性:

  • prefix:語句的前綴;
  • prefixOverrides:去除開頭;
  • suffix:語句的後綴;
  • suffixOverrides:去除結尾。

在下面的語句中,trim 會先刪除 somesql 的開頭和結尾,然後再增加前綴和後綴。

<trim prefix="前綴" prefixOverrides="去除開頭" suffix="後綴" suffixOverrides="去除結尾"> somesql</trim>

假設使用 if 語句增加兩個動態條件,如下所示。如果只滿足第二個條件,或者兩個條件都不滿足,最終得到的 SQL 是一個有 WHERE 但沒有條件的非法 SQL。

<select id="select" resultType="Person"> SELECT * FROM Person WHERE <if test="sex != null"> sex = #{sex} </if> <if test="title != null"> AND title like #{title} </if></select>

使用 where 元素可以避免這一點,如下所示。where 元素可以檢測內部的查詢條件是否合法,比如為空、多了 AND / OR,並進行處理使 SQL 語句合法。經過 where 元素處理後,無論內部 if 元素是否成立,我們都可以得到合法的 SQL 語句。

<select id="select" resultType="Person"> SELECT * FROM Person <where> <if test="sex != null"> sex = #{sex} </if> <if test="title != null"> AND title like #{title} </if> </where></select>

同樣地,update 語句中也可以使用 set 元素來實現類似於 where 元素的功能。在如下的示例中,set 元素確保了 SQL 語句中的 SET 永遠是合法的,它能自動處理 SET 為空、結尾多逗號,並自動拼接 SET 字元串。

<update id="update"> update Person <set> <if test="title != null"> title=#{title}, </if> <if test="sex != null"> sex=#{sex}, </if> </set> where id=#{id}</update>

foreach

foreach 用於處理集合,比如批量插入、批量查詢條件等情況,支持 List、Array、Set、Map 等。在下面的例子中,查詢條件是一個 list,使用 in 來查詢。

<select id="select" resultType="Person"> SELECT * FROM Person WHERE id in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach></select>

foreach 的屬性定義如下:

  • Item:集合中元素迭代的別名,如果集合為 map 這裡是 value;
  • index:集合中元素迭代的索引,如果集合為 map 這裡是 key;
  • collection:集合的類型;
  • open:語句的前綴;
  • separator:語句的分隔符;
  • close:語句的後綴。

分享學習筆記和技術總結,內容涉及 Java 進階、架構設計、前沿技術、演算法與數據結構、資料庫、中間件等多個領域,歡迎關注。本文首發於微信公眾號「後端開發那點事兒」。

推薦閱讀:

我的產品開發之旅 - SSM框架升級API平台(Spring + SpringMVC + MyBatis)
MyBatis3:SqlMapConfig配置文件
Mybatis1:基礎
Mybatis7:查詢緩存
Mybatis6:延遲載入

TAG:MyBatis |