1. 程式人生 > 實用技巧 >Mybatis--->動態SQL

Mybatis--->動態SQL

  • <if> 相當於java中的if,用於單分支的條件判斷
  • <choose>、<when>、<otherwise> 相當於java中的switch...case...default,用於多分支的條件判斷,從多個選項中選擇一個
  • <foreach> 迴圈,常和sql的in語句搭配使用
  • <where>、<trim>、<set> 輔助元素,用於一些處理sql拼裝、特殊字元的問題

動態SQL會處理掉不需要的 ,(逗號)、AND 、OR 幫助我們完成資料庫的操作

常用的就這麼幾種

<where> 的使用

<select id="queryUser" parameterType="user" resultType="user">
         SELECT * FROM user_tb
         <where>
            <if test="name!=null and name!=''">
                name=#{name}
            </if>
            <if test="tel!=null and tel!=''">
                AND tel
=#{tel} </if> </where> </select>

<set>的使用

<select id="queryUser" parameterType="user" resultType="user">
         SELECT * FROM user_tb
         <where>
            <if test="name!=null and name!=''">
                name=#{name}
            
</if> <if test="tel!=null and tel!=''"> AND tel=#{tel} </if> </where> </select>

<trim> 定製where、set的功能

<select id="queryUser" parameterType="user" resultType="user">
         SELECT * FROM user_tb
         <trim prefix="WHERE" prefixOverrides="AND">
            <if test="name!=null and name!=''">
                name=#{name}
            </if>
            <if test="tel!=null and tel!=''">
                AND tel=#{tel}
            </if>
         </trim>
</select>

prefix會在這段字串之前加上指定的字首,如果裡面的<if>都不滿足條件,則不加字首。

prefixOverrides指定要去除的多餘的字串。

<set>同理

<choose>、<when>、<otherwise>的使用

類似於Switch Case

<select id="queryPwd" parameterType="user" resultType="string">
         SELECT password FROM user_tb WHERE name=#{name}
         <choose>
             <when test="role=='admin'">
                 AND role='admin'
             </when>
             <when test="role=='teacher'">
                 AND role='teacher'
             </when>
             <when test="role=='student'">
                 AND role='student'
             </when>
         </choose>
</select>

<foreach>的使用

<select id="queryUser" parameterType="list" resultType="user">
SELECT * FROM user_tb WHERE tel IN
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach> </select>
  • collection 要迭代的資料型別,陣列=>array,List=>list,Map=>Map的key的資料型別。使用陣列容易出錯,儘量用List代替陣列。
  • index 本次迭代的下標,指定一個臨時變量表示下標
  • item 本次迭代的元素,指定一個臨時變量表示本次迭代的元素
  • open 拼接這段字串時以什麼開頭
  • close 拼接這段字串以什麼結尾
  • separator 迭代的元素之間用什麼連線(分隔)

collection是必需的,其餘均可選。