上一章我們已經講完了關于Mybatis的分頁用法,其實MyBatis 還具有的一個強大的特性之一通常是它的動態 SQL 能力。 如果你有使用 JDBC 或其他 相似框架的經驗,你就明白要動態的串聯 SQL 字符串在一起是十分糾結的,確保不能忘了空格或在列表的最后省略逗號。Mybatis中的動態 SQL 可以徹底處理這種痛苦。對于動態SQL,最通俗簡單的方法就是我們自己在硬編碼的時候賦予各種動態行為的判斷,而在Mybatis中,用一種強大的動態 SQL 語 言來改進這種情形,這種語言可以被用在任意映射的 SQL 語句中。動態 SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本處理器相似。MyBatis 采用功能強大的基于 OGNL 的表達式來消除其他元素。

  本章中我們利用前幾章構建的實例,假設幾種應用情況,通過實踐了解這幾種動態SQL標簽的用法,畢竟學習最快的途徑就是動手實踐~

  我們常用的幾個節點元素有if,choose(when, otherwise),trim(where, if),foreach。真正使用下來我感覺有點像XSLT的用法。詳細用法說明(點我)

  (1)if 的用法

   還記得上一章中我們有再ViisitMapper的分頁配置中看到if節點嗎,如果pageIndex>-1 and pageSize>-1的時候就加入相應的分頁SQL,否則就不添加(默認取全部),如下:

<select id="getListByPagenate" parameterType="PagenateArgs"
    resultType
="Visitor">
    select * from (
    
<include refid="getListSql" /> <include refid="orderBySql"/>
    ) t 
<!-- #{}表示參數化輸出,${}表示直接輸出不進行任何轉義操作,自己進行轉移 -->
    
<if test="pageStart>-1 and pageSize>-1">
        limit #{pageStart}, #{pageSize}
    
</if>
</select>
<sql id="getListSql">
    select * from Visitor where
    status>0
</sql>
<sql id="orderBySql">
    order by ${orderFieldStr} ${orderDirectionStr}
</sql>

  因為我們的參數pageIndex與pageSize都是int值所以可以這樣直接判斷,如果是對象實例我們可以利用null判斷來進行一些動態邏輯的控制,具體實際開發中就要看業務需求了。這里我認為要注意的是別十分順手的吧and寫成&&,這個在配置中不會被識別~。

  (2)choose (when, otherwise)的用法

  choose when 主要在多個條件的情況下只滿足其中一個條件的應用場景中使用,例如這里就構建一個query條件,分別傳遞id,name與createTime。假設我們查詢Visitor表時,如果VisitorId有值則,使用Id查詢,如果VisitorName有值則采用VisitName查詢,如下,還是在david.mybatis.demo.IVisitorOperation接口類中添加List<Visitor> getListChooseWhenDemo(BasicQueryArgs args)方法。在VisitorMapper中添加相應的的select節點配置:

修改后的IvisitorOperation


choose-when-otherwise動態條件配置

  (3)where if (trim)的用法

   where關鍵詞的好處是在于,如果有相應的過濾條件的話,它知道在適當的時候插入where關鍵詞。而且它也知道在何時該去掉相應的AND與OR的連接符,主要應對如下情景

<select id="findActiveBlogLike"
     resultType
="Blog">
  SELECT * FROM BLOG
  WHERE
  
<if test="state != null">
    state = #{state}
  
</if>
  
<if test="title != null">
    AND title like #{title}
  
</if>
  
<if test="author != null and author.name != null">
    AND author_name like #{author.name}
  
</if>
</select>

  不會因為所有條件不滿足變為

<select id="findActiveBlogLike"
     resultType
="Blog">
  SELECT * FROM BLOG
  WHERE
</select>

  或者因為沒有滿足第一個條件,單單滿足后面的條件變成

<select id="findActiveBlogLike"
     resultType
="Blog">
    SELECT * FROM BLOG
    WHERE
    AND title like ‘someTitle’
</select>

  所以針對這種我們可以在建立choose when條件示例,同樣在IVisitorOperation接口類中加入相應的方法public List<Visitor> getListWhereDemo(BasicQueryArgs args),把VisitorMapper配置文件中的相對應配置加上去如下:

Where if動態條件配置

  (4)foreach的用法

  在常用的動態SQL中我們有個業務場景是要where id in 一大串的ID,像這種情況我們就可以用到foreach啦,不必自己辛辛苦苦去拼接Id字符串啦。同樣的步驟還是在IVisitorOperation接口類中加入相應的方法public List<Visitor> getListForeachDemo(List<Integer> ids),然后再對應的Mapper文件中配置上相應的節點元素信息,如下:

Foreach動態條件配置

  最后你只需要在DemoRun中建立相應的測試方法,Mybatis里面的動態SQL也就完成啦,下面測試用的DemoRun方法

DemoRun方法
     DemoRun方法運行結果


最后一章會講述,怎么MybatisGenerator生成工具生成這些配置與文件~



如果你覺得這篇文章對你有用,歡迎推薦[推薦]

如果你覺得文章內有錯誤歡迎指出^0^~

如果您想轉載本博客,請注明出處

如果您對本文有意見或者建議,歡迎留言

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則作者保留追究法律責任的權利。