zoukankan      html  css  js  c++  java
  • 动态SQL

    if标签

      通常用于WHERE语句中

    <select id="getUserByName" parameterType="string" resultType="User">
         select * from account where 1=1
         <if test="_parameter!=null and _parameter!=''">
             and name like CONCAT('%',#{_parameter},'%');
         </if>
    </select>

    choose标签

      它无法实现if....else、if....else.....的逻辑,

      要想实现这样的逻辑,就需要使用到choose when otherwise标签。

      choose元素中包含when和otherwise两个标签,一个choose中至少包含一个when,有0个或1个otherwise。

      (只进一个when,当所有的when不满足时,将走otherwise)

    <select id="getUserByNameOrId" resultType="User">
         select * from account where 1=1
         <choose>
             <when test="name!=null and name!=''">
                 and name=#{name}
             </when>
             <when test="id!=-1">
                 and id=#{id}
             </when>
             <otherwise>
                 and money=1000
             </otherwise>
         </choose>
    </select>

    where标签

      如果该标签包含的元素有返回值,就插入一个where;如果where后面的字符串是以and和or开头,就将它剔除。

    <select id="getUserByNameOrId" resultType="User">
         select * from account
        <!--使用了where标签,无需手动编写where条件-->
        <where>
             <choose>
                 <when test="name!=null and name!=''">
                     and name=#{name}
                 </when>
                 <when test="id!=-1">
                     and id=#{id}
                 </when>
                 <otherwise>
                     and money=1000
                 </otherwise>
             </choose>
        </where>
    </select>

    set标签

      如果该标签包含的元素中有返回值,就插入一个set;如果set后面的字符串是以逗号结尾的,就把这个逗号剔除。

    <update id="updateUser" parameterType="User">
     <!--如果参数类型是一个对象,那么sql语句中#{对象的属性名}-->
        update account
       <!--使用<set>标签替代set语句-->
       <set>
           <if test="name!=null and name !=''">
               name=#{name},
           </if>
           <if test="money!=0">
               money=#{money},
           </if>
       </set>
    where id=#{id}
    </update>

    注意点:

      本案例在set标签中存在值时没有问题,但如果都不满足其中的if条件。

      Set标签中没有返回值的情况下 语句 将变成 update account where id=#{id},所以使用时,仍需小心

    trim标签

      Where和set标签的功能都可以使用trim标签来实现

    Where标签对应trim的用法如下

    <trim prefix="WHERE" prefixOverrides="AND|OR">
        
    </trim>

    Set标签对应trim的用法如下

    <trim prefix="SET" suffixOverrides=",">
    
    </trim>

    trim标签有如下属性:

      prefix:当trim元素中包含内容时,会给内容增加prefix指定的前缀

      prefixOverrides:当trim元素中包含内容时,会把内容中匹配的前缀去掉

      suffix:当trim元素中包含内容时,会给内容增加suffix指定的后缀

      suffixOverrides:当trim元素中包含内容时,会把内容中匹配的后缀去掉

      foreach:标签

      可以生成一系列的值,这个标签主要用于SQL的in语句后面

      foreach:元素的属性主要有 item,index,collection,open,separator,close。

      item:示集合中每一个元素进行迭代时的别名,

      index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置,

      open:表示该语句以什么开始,

      separator:表示在每次进行迭代之间以什么符号作为分隔 符,

      close:表示以什么结束

    <select id="findUserByIds" resultType="User">
        select * from account
        <!--此处必须使用list 不能使用参数名-->
        <if test="list.size>0">
            where id IN
            <foreach collection="list" open="(" close=")" separator="," item="item">
                #{item}<!--item此时表示集合中的元素-->
            </foreach>
        </if>
    </select>
        select * from account
        <!--此处必须使用list 不能使用参数名-->
        <if test="list.size>0">
            where id IN
            <foreach collection="list" open="(" close=")" separator="," item="item">
                #{item.id}<!--item此时表示集合中的元素User对象-->
            </foreach>
        </if>
    </select>
     
    <insert id="addUserList">
        insert into account values
        <foreach collection="list" item="user" separator=",">
            (DEFAULT,#{user.name},#{user.money})
        </foreach>
    </insert>
  • 相关阅读:
    BFS visit tree
    Kth Largest Element in an Array 解答
    Merge k Sorted Lists 解答
    Median of Two Sorted Arrays 解答
    Maximal Square 解答
    Best Time to Buy and Sell Stock III 解答
    Best Time to Buy and Sell Stock II 解答
    Best Time to Buy and Sell Stock 解答
    Triangle 解答
    Unique Binary Search Trees II 解答
  • 原文地址:https://www.cnblogs.com/F017/p/11658212.html
Copyright © 2011-2022 走看看