學習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值取出引數