1. 程式人生 > >Mybaits動態sql 常用標籤

Mybaits動態sql 常用標籤

Mybatis實現動態SQL,主要通過以下標籤:if,where,choose(when,otherwise),trim,set,foreach。接下來,我將逐一來說明各標籤的用法。有錯誤的地方麻煩指正~

if標籤

就是簡單的條件判斷,利用if語句我們可以實現某些簡單的條件選擇。 
這個一般用於動態選項的查詢,即多值結合查詢,選項值有可能為空,因此需要用到動態if標籤來判斷多個值存在與否。 
例1:通過年齡和居住地查詢使用者表。

<select id="find" parameterType="Admin" resultType="Admin">
        select * from admin where
1=1 <if test="age!= null and age!='' "> and age=age </if> <if test="city!= null and city!='' "> and city=city </if> </select>

注意:上面“1=1”始終為true,所以後邊可以直接接上and 語句,不然就會出現“where and age=age”這樣的錯誤。

where標籤

補充相應的where的sql語句,解決了if標籤在上面所容易造成錯誤的問題。更好地簡化了where的條件判斷。 
例2:例1的升級版。

<select id="find" parameterType="Admin" resultType="Admin">
        select * from admin
    <where>
        <if test="age!= null and age!='' ">
                and age=age
        </if>
        <if test="city!= null and city!='' ">
                and city=city
        </if
> </where> </select>

這裡就不需要再補充“1=1”的語句了,這是因為where標籤會自動幫你處理,如果where後邊是and,or開頭的會被自動忽略掉。如果使用了and,or的話,mybatis也會自動為你在前後補充空格,媽媽就再也不用擔心出現“ageandpassword”的錯誤出現~

choose標籤

相當於switch語句,通常與when和otherwise搭配使用。 
例3:根據年齡和居住地查詢表

<select id="find" parameterType="Admin" resultType="Admin">
    select * from admin where 1=1
    <choose>
        <when test="age!= null and age!=''">
            and age=#{age}
        </when>
        <when test="city!= nulland city!=''">
            and city=#{city}
        </when>
        <otherwise>
             and aname=#{aname}
        </otherwise>
    <choose>
<select>

這裡與例1和例2不同的是,這裡不會每一條都執行,類似於switch case語句。從上往下執行,當when中有條件滿足的時候,就會跳出choose。when中條件都不執行則會執行otherwise語句。即最終choose裡面僅有一條語句執行。

set標籤

類似於where功能,主要用於sql賦值更新操作,聰明的你一個可以領悟得到啦~

<update id ="update" parameterType="Admin">
    update admin
    <set>
         <if test="aname !=null and aname !='' ">
                aname=#{aname},
        </if>
        <if test="age!= null and age!='' ">
                age=#{age},
        </if>
        <if test="city!= null and city!='' ">
                password=#{password},
        </if>
    </set>
    where aid=#{aid}
</update>

補充:set標籤會自動忽略不必要的字尾逗號。

foreach標籤

類似於for迴圈,迴圈的物件可以是list和陣列。 
時常用於sql的批量操作,如批量刪除,批量新增資料等。 
例子:批量新增使用者

<insert id="addAdmin" >
        insert into amdin
        (aid,aname,pwd,city,address)
        values
        <foreach collection="list" item="item" index="index" separator=",">  
            (#{item.aid},#{item.aname},#{item.pwd},#{item.city},#{item.address)       
        </foreach>  
</insert>

與之相應的sql語句為:insert into admin (…) values(…);。foreach就將物件一個個存入資料庫中。

例子:批量刪除使用者

<delete id="delAdmin">
     delete from admin where aid in
     <foreach collection="array" item="aid" open="(" separator=","  close=")">
           #{aid}
     </foreach>
</delete>

相應的語句為:delete from admin where aid into(…);。foreach會將陣列轉為(aid,aid,aid)的形式,主要看foreach的後三個屬性就知道啦

trim標籤

十分強大!可以自定義新增前後綴,與之對應的屬性是prefix和suffix。同時通過prefixOverrides和suffixOverrides分別來覆蓋首尾部的內容,即忽略不必要的前後綴。就是說它可以充當where標籤,也可以充當set標籤啦~ 
例: 
充當where標籤:

<trim prefix = "where" prefixOverrides="and|or" >
    ...
</trim>

充當set標籤:

<trim prefix="set" suffixOverrides=",">
    ...
</trim>

例子:動態新增使用者屬性

<insert id="find" resultType="Admin">
    insert into admin 
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test = "aname != null and aname !='' ">
            aname,
        </if>
        <if test = "city != null and city !='' ">
            city,
        </if>
        <if test = "age != null and age !='' ">
            age,
        </if>
    </trim>
    <trim prefix="values(" suffix=")" suffixOverrides=",">
        <if test = "aname != null and aname !='' ">
            #{aname},
        </if>
        <if test = "city != null and city !='' ">
            #{city},
        </if>
        <if test = "age != null and age !='' ">
            #{age},
        </if>
    </trim>
</insert>