邏輯標籤(動態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>