1. 程式人生 > 其它 >邏輯標籤(動態sql)

邏輯標籤(動態sql)

MyBatis if標籤:條件判斷

if 語句使用方法簡單,常常與 test 屬性聯合使用。語法如下。

<if test="判斷條件">
    SQL語句
</if>

當判斷條件為 true 時,才會執行所包含的 SQL 語句。

最常見的場景是在 if 語句中包含 where 子句,例如。

<select id="selectAllWebsite" resultMap="myResult">
    select id,name,url from website where 1=1
    <if test="name != null">
        AND name like #{name}
    
</if> <if test="url!= null"> AND url like #{url} </if> </select>

MyBatis choose、when和otherwise標籤

MyBatis 中動態語句 choose-when-otherwise 類似於 Java 中的 switch-case-default 語句。由於 MyBatis 並沒有為 if 提供對應的 else 標籤,如果想要達到<if>...<else>...</else> </if> 的效果,可以藉助 <choose>、<when>、<otherwise> 來實現。

動態語句choose-when-otherwise 語法如下。

<choose>
    <when test="判斷條件1">
        SQL語句1
    </when >
    <when test="判斷條件2">
        SQL語句2
    </when >
    <when test="判斷條件3">
        SQL語句3
    </when >
    <otherwise>
        SQL語句4
    </otherwise>
</choose>

示例使用choose-when-otherwise 標籤實現。

<mapper namespace="net.biancheng.mapper.WebsiteMapper">
    <select id="selectWebsite"
        parameterType="net.biancheng.po.Website"
        resultType="net.biancheng.po.Website">
        SELECT id,name,url,age,country
        FROM website WHERE 1=1
        <choose>
            <when test="name != null and name !=''">
                AND name LIKE CONCAT('%',#{name},'%')
            </when>
            <when test="url != null and url !=''">
                AND url LIKE CONCAT('%',#{url},'%')
            </when>
            <otherwise>
                AND age is not null
            </otherwise>
        </choose>
    </select>
</mapper>

MyBatis where標籤

where 標籤主要用來簡化 SQL 語句中的條件判斷,可以自動處理 AND/OR 條件,語法如下。

<where>
    <if test="判斷條件">
        AND/OR ...
    </if>
</where>

if 語句中判斷條件為 true 時,where 關鍵字才會加入到組裝的 SQL 裡面,否則就不加入。where 會檢索語句,它會將 where 後的第一個 SQL 條件語句的 AND 或者 OR 關鍵詞去掉。

示例

<select id="selectWebsite" resultType="net.biancheng.po.Website">
    select id,name,url from website
    <where>
        <if test="name != null">
            AND name like #{name}
        </if>
        <if test="url!= null">
            AND url like #{url}
        </if>
    </where>
</select>

MyBatis set標籤

在 Mybatis 中,update 語句可以使用 set 標籤動態更新列。set 標籤可以為 SQL 語句動態的新增 set 關鍵字,剔除追加到條件末尾多餘的逗號。

    <update id="updateWebsite"
        parameterType="net.biancheng.po.Website">
        UPDATE website
        <set>
            <if test="name!=null">name=#{name}</if>
            <if test="url!=null">url=#{url}</if>
        </set>
        WHERE id=#{id}
    </update>        

MyBatis foreach標籤

對於一些 SQL 語句中含有 in 條件,需要迭代條件集合來生成的情況,可以使用 foreach 來實現 SQL 條件的迭代。

Mybatis foreach 標籤用於迴圈語句,它很好的支援了資料和 List、set 介面的集合,並對此提供遍歷的功能。語法格式如下。

<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">
    引數值
</foreach>

foreach 標籤主要有以下屬性,說明如下。

  • item:表示集合中每一個元素進行迭代時的別名。
  • index:指定一個名字,表示在迭代過程中每次迭代到的位置。
  • open:表示該語句以什麼開始(既然是 in 條件語句,所以必然以(開始)。
  • separator:表示在每次進行迭代之間以什麼符號作為分隔符(既然是 in 條件語句,所以必然以,作為分隔符)。
  • close:表示該語句以什麼結束(既然是 in 條件語句,所以必然以)開始)。


使用 foreach 標籤時,最關鍵、最容易出錯的是 collection 屬性,該屬性是必選的,但在不同情況下該屬性的值是不一樣的,主要有以下 3 種情況:

  • 如果傳入的是單引數且引數型別是一個 List,collection 屬性值為 list。
  • 如果傳入的是單引數且引數型別是一個 array 陣列,collection 的屬性值為 array。
  • 如果傳入的引數是多個,需要把它們封裝成一個 Map,當然單引數也可以封裝成 Map。Map 的 key 是引數名,collection 屬性值是傳入的 List 或 array 物件在自己封裝的 Map 中的 key。

示例

<select id="selectWebsite"
    parameterType="net.biancheng.po.Website"
    resultType="net.biancheng.po.Website">
    SELECT id,name,url,age,country
    FROM website WHERE age in
    <foreach item="age" index="index" collection="list" open="("
        separator="," close=")">
        #{ageList}
    </foreach>
</select>

MyBatis bind標籤

每個資料庫的拼接函式或連線符號都不同,例如 MySQL 的 concat 函式、Oracle 的連線符號“||”等。這樣 SQL 對映檔案就需要根據不同的資料庫提供不同的實現,顯然比較麻煩,且不利於程式碼的移植。幸運的是,MyBatis 提供了 bind 標籤來解決這一問題。

bind 標籤可以通過 OGNL 表示式自定義一個上下文變數。

比如,按照網站名稱進行模糊查詢,SQL 對映檔案如下。

<select id="selectWebsite" resultType="net.biancheng.po.Website">
    <bind name="pattern" value="'%'+_parameter+'%'" />
    SELECT id,name,url,age,country
    FROM website
    WHERE name like #{pattern}
</select>

bind 元素屬性如下。

  • value:對應傳入實體類的某個欄位,可以進行字串拼接等特殊處理。
  • name:給對應引數取的別名。


以上程式碼中的“_parameter”代表傳遞進來的引數,它和萬用字元連線後,賦給了 pattern,然後就可以在 select 語句中使用這個變數進行模糊查詢,不管是 MySQL 資料庫還是 Oracle 資料庫都可以使用這樣的語句,提高了可移植性。

示例

<select id="selectWebsite" resultType="net.biancheng.po.Website">
    <bind name="pattern_name" value="'%'+name+'%'" />
    <bind name="pattern_url" value="'%'+url+'%'" />
    SELECT id,name,url,age,country
    FROM website
    WHERE name like #{pattern_name}
    AND url like #{pattern_url}
</select>

MyBatis trim標籤

在 MyBatis 中除了使用 if+where 實現多條件查詢,還有一個更為靈活的元素 trim 能夠替代之前的做法。

trim 一般用於去除 SQL 語句中多餘的 AND 關鍵字、逗號或者給 SQL 語句前拼接 where、set 等字尾,可用於選擇性插入、更新、刪除或者條件查詢等操作。trim 語法格式如下。

<trim prefix="字首" suffix="字尾" prefixOverrides="忽略字首字元" suffixOverrides="忽略字尾字元">
    SQL語句
</trim>

trim 中屬性說明如下。

屬性描述
prefix 給SQL語句拼接的字首,為trim 包含的內容加上字首
suffix 給SQL語句拼接的字尾,為trim 包含的內容加上字尾
prefixOverrides 去除 SQL 語句前面的關鍵字或字元,該關鍵字或者字元由 prefixOverrides 屬性指定。
suffixOverrides 去除 SQL 語句後面的關鍵字或者字元,該關鍵字或者字元由 suffixOverrides 屬性指定。

示例

<select id="selectWebsite" resultType="net.biancheng.po.Website">
    SELECT id,name,url,age,country
    FROM website
    <trim prefix="where" prefixOverrides="and">
        <if test="name != null and name !=''">
            AND name LIKE CONCAT ('%',#{name},'%')
        </if>
        <if test="url!= null">
            AND url like concat ('%',#{url},'%')
        </if>
    </trim>
</select>