天天看點

Mybatis使用動态sql

動态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>