程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Mybatis學習筆記(四) 之動態SQL語句,mybatis學習筆記

Mybatis學習筆記(四) 之動態SQL語句,mybatis學習筆記

編輯:JAVA綜合教程

Mybatis學習筆記(四) 之動態SQL語句,mybatis學習筆記


動態SQL

mybatis 的動態sql語句是基於OGNL表達式的。可以方便的在 sql 語句中實現某些邏輯. 總體說來mybatis 動態SQL 語句主要有以下幾類:

1. if 語句 (簡單的條件判斷)
2. choose (when,otherwize) ,相當於java 語言中的 switch ,與 jstl 中的choose 很類似.
3. trim (對包含的內容加上 prefix,或者 suffix 等,前綴,後綴)
4. where (主要是用來簡化sql語句中where條件判斷的,能智能的處理 and or ,不必擔心多余導致語法錯誤)
5. set (主要用於更新時)
6. foreach (在實現 mybatis in 語句查詢時特別有用)

1、if 處理

普通帶有where查詢的語句如下,

    <!-- 綜合查詢 -->
    <select id="findUserList"  parameterType="User" resultType="User">
        select * from `user` where id = #{id} and userName like '%${userName}%' 
    </select>

此時,如果id或userName為null,此語句查詢結果可能報錯,那麼我們可以對where語句使用邏輯上的if判斷:如果值為null或等於空字符串,我們就不進行此條件的判斷,增加靈活性。

加入判斷之後,如下:

<!-- 傳遞pojo綜合查詢用戶信息 -->
	<select id="findUserList" parameterType="user" resultType="user">
		select * from user where 1=1 
		<if test="id!=null and id!=''">and id=#{id}
		</if>
		<if test="username!=null and username!=''">and username like '%${username}%'
		</if>
	</select>

這條語句查詢用戶表,如果id或usrname不為null或空,傳入userName和id查詢條件,那麼就查詢語句就為:select * from `user` where id = #{id} and userName like '%${userName}%' ;反之,則查詢select * from user where 1=1 所有記錄。

注意:where語句中加上1=1的目的就是防止 if語句中都不成立情況下,where語句後條件會為空,這樣會報錯的。如下:如果if條件都不成立,就相當於查詢,select * from user where 這是錯誤的sql語句。

<!-- 傳遞pojo綜合查詢用戶信息 -->
	<select id="findUserList" parameterType="user" resultType="user">
		select * from user where
		<if test="id!=null and id!=''">and id=#{id}
		</if>
		<if test="username!=null and username!=''">and username like '%${username}%'
		</if>
	</select>

2、choose (when, otherwise)處理

相當於java語言中的switch,有時候我們並不想應用所有的條件,而只是想從多個選項中選擇一個。而使用if標簽時,只要test中的表達式為true,就會執行if標簽中的條件。MyBatis提供了choose 元素。if標簽是與(and)的關系,而choose標簽是或(or)的關系。

choose標簽是按順序判斷其內部when標簽中的test條件出否成立,如果有一個成立,則choose結束,跳出choose,當choose中所有when的條件都不滿則時,則執行otherwise中的sql。類似於Java 的switch 語句,choose為switch,when為case,otherwise則為default

<select id="queryByName" parameterType="User" resultType="User">  
    SELECT <include refid="columns"></include>  
    FROM sys_user  
    WHERE user_type_id = 1  
    <choose>  
        <when test="userName != null">user_name like '%' #{userName} '%'</when>  
        <when test="nickName != null">nick_name like '%' #{nickName} '%'</when>  
        <otherwise>is_valid = 1</otherwise>  
    </choose>  
</select>  

3、trim處理

trim (對包含的內容加上 prefix,或者 suffix 等,前綴,後綴) 

trim 屬性

                prefix:前綴覆蓋並增加其內容

                suffix:後綴覆蓋並增加其內容

                prefixOverrides:前綴判斷的條件

                suffixOverrides:後綴判斷的條件

    <select id="findUserList"  parameterType="User" resultType="User">
        select b.* from sys_menu b where where 1=1
    	<trim suffix="WHERE" suffixOverrides="AND | OR">  
    		<if test="id != null and id !='' ">  AND b.id =#{id}  </if>  
    		<if test="name != null">  AND b.menu_name like #{name}  </if>  
        </trim>  
    </select>

最終sql打印為:select b.* from sys_menu b where 1 = 1 AND b.menu_name like '' WHERE

4、foreach處理

傳遞list實現

當要傳入多個id查詢時候,比如 :SELECT * FROM USERS WHERE username LIKE '%張%'  and id IN (10,89,16),在使用IN查詢的時候。

這個時候,就可以使用foreach來傳入參數。如果if成立,實現的查詢語句就為上面sql語句。

<select id="selectUserByList" parameterType="java.util.List" resultType="user">
		select * from user 
		<where>
		<!-- 傳遞List,List中是pojo -->
		<if test="list!=null">
		<foreach collection="list" item="item" open="and id in("separator=","close=")">
		    #{item.id} 
		</foreach>
		</if>
		</where>
	</select>

傳遞單個數據(數組中是字符串類型)實現

<!-- 傳遞數組綜合查詢用戶信息 -->
	<select id="selectUserByArray" parameterType="Object[]" resultType="user">
		select * from user 
		<where>
		<!-- 傳遞數組 -->
		<if test="array!=null">
		<foreach collection="array"index="index"item="item"open="and id in("separator=","close=")">
		    #{item} 
		</foreach>
		</if>
		</where>
	</select>

我們知道Mybatis進行SQL映射時,傳入參數只能有一個,如果想傳入多個參數,只能使用Java的List或是Array進行封裝後再傳入。上面的語句就是將要刪除的多條記錄的Id值放在了List對象中傳入。

foreach 元素的功能是非常強大的,它允許你指定一個集合,聲明可以用在元素體內的集合項和索引變量。它也允許你指定開閉匹配的字符串(上例中的open和close屬性)以及在迭代中間放置分隔符(separator屬性)。這個元素是很智能的,因此它不會偶然地附加多余的分隔符。

我們可以將一個 List 實例或者數組作為參數對象傳給 MyBatis,當我們這麼做的時候,MyBatis 會自動將它包裝在一個 Map 中並以名稱為鍵。List 實例將會以“list”作為鍵,而數組實例的鍵將是“array”。

參考

1、mybatis系列:http://blog.csdn.net/chris_mao/article/details/48827961

2、動態sql語句:http://limingnihao.iteye.com/blog/782190

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved