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