動态sql
常見的幾種:trim、where、set、foreach、if、choose、when
下面通過案例一一示範
if文法
1 <select id="selectIfTest1" resultType="cn.kgc.mybatisdemo.mode.User">
2 select id , userCode , userName from smbms.smbms_user where 1=1
3 <if test="userName !=null and userName != '' ">
4 and userName like concat('%',#{userName},'%')
5 </if>
6 <if test="roleId != 0">
7 and userRole = #{roleId}
8 </if>
9 </select>
if子產品在判斷通過後拼接子產品内的代碼
接下來是where代碼
1 <select id="selectIfTest2" resultType="cn.kgc.mybatisdemo.mode.User">
2 select id , userCode , userName from smbms.smbms_user
3 <where>
4 <if test="userName != null and userName != ''">
5 and userName like concat('%',#{userName},'%')
6 </if>
7 <if test="roleId != 0">
8 and roleId = #{roleId}
9 </if>
10 </where>
11 </select>
/*
where标簽代替了where關鍵字,他除了能給添加關鍵字同時,
也可以智能的出去多餘的and和or,where标簽一般和if一起使用
當where标簽中的if條件都不滿足要求的時候,where标簽不會拼接關鍵字
*/
set标簽的使用
1 <update id="updateUserTest3">
2 update smbms.smbms_user
3 <set>
4 <if test="userName != null and userName != ''">
5 userName = #{userName},
6 </if>
7 <if test="userCode != null and userCode != ''">
8 userCode = #{userCode},
9 </if>
10 <if test="userPassword != null and userPassword != ''">
11 userPassword = #{userPassword},
12 </if>
13 <if test="modifyDate != null" >
14 modifyDate = now(),
15 </if>
16 </set>
17</update>
/*
set标簽 代替set關鍵字,可以智能的删除多餘的逗号
其他内容和where一樣,修改的時候必須要傳值,否則會報錯,這樣就沒意義了
*/
trim的使用
<update id="updateUserTest4">
update smbms_user
<trim prefix="set" suffixOverrides="," suffix="where id = #{id}">
<if test="userName != null and userName != ''">
userName = #{userName},
</if>
<if test="userCode != null and userCode != ''">
userCode = #{userCode},
</if>
<if test="userPassword != null and userPassword != ''">
userPassword = #{userPassword},
</if>
<if test="modifyDate != null" >
modifyDate = now(),
</if>
</trim>
</update>
/*
prefix添加字首
prefixOverride清除字首’
suffix添加字尾
suffixOverride清除字尾
trim 迄今為止最好用的标簽
*/
foreach的三種形式
<select id="selectUserByForeachArray" resultType="cn.kgc.mybatisdemo.mode.User">
select id,userName,userCode,userPassword from smbms.smbms_user
where userRole in
/*
collection:目前的參數類型(必填)
open:開始要添加的字元
separator:分隔符
close:結束時要添加的字元
item:相當于變量
*/
<foreach collection="array" open="(" separator="," close=")" item="roleId">
#{roleId}
</foreach>
</select>
第二種
<select id="selectUserByList" resultType="cn.kgc.mybatisdemo.mode.User">
select id,userName,userCode,userPassword from smbms.smbms_user where userRole in
<foreach collection="list" item="roleId" open="(" separator="," close=")">
#{roleId}
</foreach>
</select>
第三種
<select id="selectUserByMap" resultType="cn.kgc.mybatisdemo.mode.User">
select id,userName,userCode,userPassword from smbms.smbms_user where userRole in
/*
這裡的collection的值放的是Map集合的鍵
*/
<foreach collection="roleId" open="(" separator="," close=")" item="roleId">
#{roleId}
</foreach>
and gender = #{gender}
</select>
choose的使用
<select id="selectUserByChoose" resultType="cn.kgc.mybatisdemo.mode.User">
select id,userName,userCode,userPassword from smbms.smbms_user
/*
choose類似于java中的switch when相當于case,隻要走一個分支就不進入其他分支
otherwise是預設,如果上面條件不滿足就走它
*/
<where>
<choose>
<when test="id != 0 and id != null">
id = #{id}
</when>
<when test="userName != null and userName != '' ">
userName like concat('%',#{userName},'%')
</when>
<when test="gender">
gender = #{gender}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</where>
</select>