1. 程式人生 > >學習Mybatis(6):動態SQL

學習Mybatis(6):動態SQL

五大元素

元素 作用
if 單條件分支判斷

choose(when,otherwise)

多條件分支判斷
trim(where,set) SQL拼裝

foreach

迴圈語句
bind 引數修飾


如果test屬性為真,則進行語句拼裝,例如:1.if元素

<select id="getUserByUserName" resultType="mybatis.User" parameterType="string">
    select * from User where userName=#{userName} 
    <if test="userName!='zhangsan'">
        order by age
    </if>
</select>

這裡的意思是,如果傳入的userName不是zhangsan,則根據age欄位排序

2.choose元素

choose元素類似於 switch-case 語句:

<select id="getUserByUserName" resultType="mybatis.User" parameterType="string">
    select * from User where 1=1
    <choose>
        <when test="userName='zhangsan">
            and userName=#{userName}
        </when>
        <when test="userName='lisi">
            and userName like concat('%',#{userName},'%')
        </when>
        <otherwise>
            and userName= concat(#{userName},'_test')
        </otherwise>
    </choose>    
</select>

這裡的意思是,如果傳入的userName是zhangsan,則直接進行完全匹配,如果是lisi,則模糊匹配,否則與#{userName}_test完全匹配

3.trim

1)where:符合條件才會拼入where關鍵字

<select id="getUserByUserNameOrNot" resultType="mybatis.User" parameterType="string">
    select * from User
    <where>
        <if test="userName!='zhangsan'">
            userName=#{userName} 
        </if>
    </where>
</select>

如果userName不是zhangsan,則拼入"where userName=#{userName}",否則什麼都不拼入

2)trim:如果條件成立,則用prefix屬性值替代if標籤包含的語句中指定的關鍵字

<select id="getUserByUserNameOrNot" resultType="mybatis.User" parameterType="string">
    select * from User
    <trim prefix="where" prefixOverrides="and">
        <if test="userName!='zhangsan'">
            and userName=#{userName} 
        </if>
    </trim>
</select>

如果userName不是zhangsan,則拼入"where userName=#{userName}"(而不是"where and userName=#{userName}"),否則什麼都不拼入

3)set:符合條件時才拼入set關鍵字,類似where

4.foreach元素

對傳入的元素進行遍歷,多用於 where … in 語句

<select id="getUserByIds" resultType="mybatis.User" parameterType="java.util.List">
    select * from User
    <foreach item="item" index="index" collection="ids" open="where id in (" separator="," close=")">
        #{item}
    </foreach>
</select>

item 代表迴圈中的當前元素,index 代表當前下標,open、close、separator用來組裝元素,collection是傳入的列表名

當使用 Map 物件(或者 Map.Entry 物件的集合)時,index 是鍵,item 是值。

上面的語句意思大致類似於:

String s="select * from User where id in (";
for(int id:ids){
    s+=(id+",");
}
s+=")";

5.bind元素

<select id="getHobbyByUser" resultType="mybatis.Hobby" parameterType="mybatis.User">
    <bind name="ids" value="'('+id+',0)'"/>    
    select * from Hobby where userId in #{ids}
</select>

就是對傳入的引數進行修飾,可以用_parameter內建引數代替傳入的引數,例如:

<select id="getUserByUserName" resultType="mybatis.User" parameterType="string">
    <bind name="test" value="'%'+_parameter+'%'"/>
    select * from User where userName like #{test}
</select>

如果傳入多個引數,並需要bind,可以:

1)使用_parameter.get取出第0、1、2……個引數

2)對引數使用@Param註解,使用註解value值取出引數