動態SQL


實現動態SQL的元素

if (多條件選擇)

  用來判斷參數   在需要判斷參數的SQL語句中添加if

  屬性
      test

    要判斷的條件
    如果滿足該條件,則會在sql語句中增加if中的那一段sql語句

<!-- if判斷條件 -->
<select id="userListAssociation" resultMap="userRoleAssociation">
    select u.*,r.id as r_id,r.roleName,r.roleCode from smbms_user u,smbms_role r 
      where u.userRole = r.id
          <!-- 如果userName不是空值null的話,則進入if -->
          <if test="userName!=null">
              and    
                  `userName` LIKE CONCAT('%',#{userName},'%')
          </if>
          <!-- 如果userRole不是空值null的話,則進入if -->
          <if test="userRole!=null">
              AND
                `userRole`=#{userRole}
        </if>
</select>
if

where (簡化sql判斷條件)

  使用where標簽時,它上層的sql語句不加where條件關鍵字
  如果where標簽內有返回值,則where會自動給sql語句加上where
  如果這個標簽(返回值)是以and,or等查詢關鍵字開頭,則自動去除這些關鍵字
  如果where標簽內沒有返回值,則不加where條件關鍵字

<!-- where -->
<select id="getUserListByPojo" resultType="User" parameterType="User">
    SELECT * FROM `smbms_user`
    
    <!--
        外層的where關鍵字不用寫
        如果where標簽內有返回值,則自動加上where關鍵字,如果沒有返回值,則不會加where關鍵字
    -->
    <where>
        <if test="userName!=null">
            `userName` LIKE CONCAT('%',#{userName},'%')
        </if>
        <if test="userRole!=null">
             AND `userRole`=#{userRole}
        </if>
    </where> 
</select>
where

 

set (set動態更新)

  更新時,若某個參數為null,則不需要更新,保持數據庫原值
  使用set標簽時,它的上層sql語句不加set條件關鍵字
  如果set標簽內有返回值,則set會自動給sql語句加上set關鍵字
  set標簽會自動去除(返回值)以","分隔符結束的sql語句

<!-- set -->
<update id="updateUser">
    UPDATE `smbms_user`
    <!-- 使用set處理分隔符“ , ” -->
    <set>
        <if test="userCode!=null">
            `userCode` = #{userCode},
        </if>
        <if test="userName!=null">
            `userName` = #{userName}
        </if>
    </set>
    WHERE `id` = #{id}
</update>
set

trim(去除多余關鍵字(代替set和where))

  trim標簽會自動識別標簽內是否有返回值,如果有返回值,則會加上屬性的作用

  屬性

    prefix前綴(在trim元素包含的內容上加上前綴)

      where----------where標簽
      set----------set標簽

    suffix后綴(在trim元素包含的內容上加上后綴)

    prefixOverrides前綴覆蓋

      可以覆蓋(去除)sql語句開頭的and或or關鍵字等,例:prefixOverrides="and | or"

    suffixOverrides后綴覆蓋

      可以覆蓋sql語句尾部的","分隔符,例:suffixOverrides=","

    trim代替where

<!-- trim代替where -->
<select id="getUserListByPojos" resultType="User" parameterType="User">
    SELECT * FROM `smbms_user`
    
    <!-- 通常prefix="where"和prefixOverrides="and | or"一起-->
    <!-- 前綴是where,去除sql語句中開頭的and或or -->
    <trim prefix="where" prefixOverrides="and | or">
        <if test="userName!=null">
            `userName` LIKE CONCAT('%',#{userName},'%')
        </if>
        <if test="userRole!=null">
             AND `userRole`=#{userRole}
        </if>
    </trim>
</select>

    trim代替set

<!-- trim代替set -->    
<update id="updateUsers">
    UPDATE `smbms_user`
    <!-- 通常prefix="set"和suffixOverrides=","一起 -->
    <!-- 前綴是set,去除sql語句尾部的"," -->
    <trim prefix="set" suffixOverrides=",">
        <if test="userCode!=null">
            `userCode` = #{userCode},
        </if>
        <if test="userName!=null">
            `userName` = #{userName}
        </if>
    </trim>
    WHERE `id` = #{id}
</update>

 foreach(迭代一個集合,一般用於in條件)

  foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合

  屬性

    item
      給集合或數組起個別名
    index
      指定一個名稱,表示迭代時每次迭代到的位置
    collection必須指定(指定用什么類型接收)
      list 集合
      array 數組
      map-key 鍵值對
    open  表示改語句以什么開始,它的值是(
    separator 分割符,它的值是 ","
    close  表示改語句以什么結束,它的值是)

  collection="array"在mapper中示例

<!-- foreach collection="array" -->
<select id="getUserListArray" resultType="User">
    SELECT * FROM `smbms_user` where id in
    
    <!-- 
        collection="array"
        item="ids"        給數組的名稱是ids
        open="("        以"("開始
        close=")"        以")"結束
        separator=","    分隔符是","
     -->
    <foreach collection="array" item="ids" open="("  close=")" separator=",">
        <!-- ONGL表達式引用數組中的值 -->
        #{ids}
    </foreach>
</select>

  collection="array"在接口中示例

/**
 * collection="array"    使用數組傳入參數
 * @param ids
 * @return
 */
public List<User> getUserListArray(Integer [] ids);

  -------List與Array基本一樣-------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM