动态SQL语句

Posted 别念茶茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态SQL语句相关的知识,希望对你有一定的参考价值。

动态SQL语句


if标签
例子:
<select id="listProduct" resultType="Product">
      select * from product
      <if test="name!=null">
             where name like concat(‘%‘,#{name},‘%‘)
      </if>        
</select>

where标签
<where>标签会进行自动判断
如果任何条件都不成立,那么就在sql语句里就不会出现where关键字
如果有任何条件成立,会自动去掉多出来的 and 或者 or。
例子:
<select id="listProduct" resultType="Product">
    select * from product
    <where>
        <if test="name!=null">
            and name like concat(‘%‘,#{name},‘%‘)
        </if>             
        <if test="price!=null and price!=0">
            and price > #{price}
        </if>    
    </where>         
</select>

set标签
与where标签类似,在update语句里也会碰到多个字段相关的问题
如果任何条件都不成立,sql语句就不会出现set关键字
如果有任何条件成立,set标签会自动去掉最后一个逗号
<update id="updateProduct" parameterType="Product" >
        update product
        <set>
            <if test="name != null">name=#{name},</if>
            <if test="price != null">price=#{price}</if>
        </set>
         where id=#{id}   
</update>

trim标签
trim 用来定制想要的功能
trim标签可以替换where和set标签:
prefixOverrides:前缀覆盖(去掉多余的前缀)
<trim prefix="where" prefixOverrides="and |or ">
      ... 
</trim>
suffixOverrides:后缀覆盖(去掉多余的后缀)
<trim prefix="SET" suffixOverrides=",">
  ...
</trim>
例子:
    <select id="listProduct" resultType="Product">
        select * from product
        <trim prefix="WHERE" prefixOverrides="AND |OR ">
            <if test="name!=null">
                and name like concat(‘%‘,#{name},‘%‘)
            </if>        
            <if test="price!=null and price!=0">
                and price > #{price}
            </if>
        </trim>      
    </select>
     
    <update id="updateProduct" parameterType="Product" >
        update product
        <trim prefix="SET" suffixOverrides=",">
            <if test="name != null">name=#{name},</if>
            <if test="price != null">price=#{price}</if>
              
        </trim>
         
         where id=#{id}   
    </update>

choose标签:(if else的效果)
Mybatis里面没有else标签,但是可以使用when otherwise标签来达到这样的效果。
任何when条件成立,就进行条件查询,否则就使用otherwise条件查询
例子:
<select id="listProduct" resultType="Product">
      SELECT * FROM product 
      <where>
          <choose>
          <when test="name != null">
            and name like concat(‘%‘,#{name},‘%‘)
          </when>              
          <when test="price !=null and price != 0">
            and price > #{price}
          </when>                      
            <otherwise>
                and id >1
            </otherwise>
          </choose>
      </where>
</select>

foreach标签
通常用于in 这样的语法里
例子:
    <select id="listProduct" resultType="Product">
          select * from product where id in
                <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
                    #{item}
                </foreach>
    </select>
调用的时候传入一个list集合的对象为参数

bind标签
就像是对传入的参数做一次字符串拼接,方便后续使用
例子:模糊查询,将传入的name前后拼接上%
        <select id="listProduct" resultType="Product">
            <bind name="likename" value="‘%‘ + name + ‘%‘" />
            select * from   product  where name like #{likename}
        </select>






































































































以上是关于动态SQL语句的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis:动态sql语句

PL/SQLPL/SQL中动态执行SQL语句

mybatis 动态SQL .2

mybatis 详解------动态SQL

mybatis 详解------动态SQL

SQL 动态SQL语句查询获取数据