mybatis动态SQL

Posted 过期可乐

tags:

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

  有时候静态SQL语句并不能很好的满足我们的业务,我们希望通过一些条件,来构建动态SQL语句

  mybatis对动态SQL提供了一些:<if>  <where> <trim>  <choose>  <when>  <foreach>  <set> 来实现

1、<if>块

<if  test="要判断的内容">

  如果条件成立SQL语句会跟上这里面的内容

</if>

<if test="salary != null">
     and salary > #{salary}
</if>

  

2、<where>块

where 元素,会自动帮我们添加where ,并且去除where 后面的and or

例如下面的代码,如果两个条件都成立的话SQL语句是where xxx = ? and yyy > ?....

如果第一个条件不成立,SQL语句是where yyy > ?.....

<where>

  <if test = "xxx">

    and xxx = #{id}

  </if>

  <if test = "xxx">

    and yyy > #{salary}

  </if>

  ......

</where>

 

3、<trim>块

trim:用来裁剪字符串用的,有四个属性

prefix:自动添加前缀

prefixOverrides:把前缀后面的内容覆盖掉

suffix:自动添加后缀

suffixOverrides:把后缀前面的内容覆盖掉

 

 

    insert into student
        values 
        <trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=",">
            ,#{id},#{name},
        </trim>

 

这样我们得到的sql语句就是:insert into student values(#{id},#{name})

trim自动添加()前后缀,并且把(后面的逗号移除,把)前面的逗号移除

如果希望移除多种情况,可以像这样设置:prefixOverrides=",|."

 

4、<choose>、<when>、<otherwise>块

有点类似于java里面的  switch  case  default

choose =  switch

when   =  case

otherwise  =  default

如果when里面的条件满足,就不会执行后面的when块和otherwise块了

只选择一个,如果when块都不满足,会选择otherwise块

<choose>
          <when test="salary > 10000 ">
                xxxx1
          </when>
          <when test="salary > 5000">
                xxxx2
          </when>
          <otherwise>
                xxxx3
          </otherwise>
</choose>

5、<set>块

<set>:只写一个,会帮我们自动剔除最后的逗号,不会处理控制的情况,不会自动加逗号

一般用在update操作中

 

<update id="xxx">
        update employee
        values 
        <set>
               <trim prefix="(" suffix=")," suffixOverrides=",">
                   <if test="id != null">
                       id = #{id},
                   </if>
                   <if test="name != null">
                       name = #{name},
                   </if>
               </trim> 
        </set>
        <where>
            eid = #{eid}
        </where>
    </update>

 

一般搭配一些逻辑一起使用。

6、<foreach>循环

collection属性值:官方说法,所有可以迭代的变量都行

Dao类方法参数类型是List:collection的值可以是:list,参数名(注解@Param声明的名字,arg0...,param1....)

Dao类方法参数类型是Map:collection的值可以是:参数名(注解@Param声明名字,arg0...,param1....),参数名.keys()或参数名.values()

注意:不能填list,map,或collection,item,和index

separator:以什么分隔

open:以什么开始

close:以什么结束

item:给遍历的元素起的别名

index:下标/索引

<update id="xxx">
        insert into employee(username,salary,gender)
        values 
            <foreach collection="empList" item="emp" open="(" separator="," close=")" index="i">
                username = #{username},
                salary = #{salary},
                gender = #{gender}
            </foreach>
 </update>

这样就能生成动态的SQL语句:insert into employee(username,salary,gender)  values(xxx,xxx,xxx),(xxx,xxx,xxx)

open在遍历empList时,先添加一个(,然后等里面的操作执行完成准备遍历下一个时,close会跟上一个),最后separator会补上一个逗号,当是最后一个元素时,不会补逗号

 

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

mybatis动态sql片段与分页,排序,传参的使用

Mybatis -- 动态Sql概述动态Sql之<if>(包含<where>)动态Sql之<foreach>sql片段抽取

mybatis动态sql之利用sql标签抽取可重用的sql片段

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段

Mybatis动态sql