MyBatis_03_MyBatis配置_03_MyBatis的动态SQL

MyBatis的动态SQL基于 OGNL 表达式,可以很方便的在SQL语句中辅助实现逻辑。

3.3.1 实现动态SQL的元素

MyBatis中实现动态SQL的元素:

  • if
  • choose(when,otherwise)
  • trim
  • where
  • set
  • foreach

3.3.2 if元素

该元素适用于简单的判断,利用if语句可以实现某些简单的条件选择。

原符号<<=>>=&
替换符号&lt;&lt;=&gt;&gt;=&amp;&apos;&quot;

3.3.3 choose(when,otherwise)元素

该元素的作用相当于Java中的switch语句,基本上跟JSTL中的choose的作用和用法是一样的,通常与when和otherwise搭配使用。
例如:

when元素的作用是当条件满足时就输出其中的内容,与Java语言中的switch效果一样,按照条件的顺序当when中条件满足时就会跳出choose,也就是所有的when和otherwise条件中只会有一个输出,即当所有的条件都不满足时就只输出otherwise中的内容。

3.3.4 where元素

该元素的作用是简化SQL语句中where中条件的判断。
例如:

该元素的作用是会在写入where元素的地方输出一个where,不需要考虑该元素中输出是什么结果,因为MyBatis会智能的帮助处理。
如果所有的条件均不满足则MyBatis会查出所有的记录,如果第一个输出的是“and”或“or”开头的,则MyBatis会把第一个“and”或“or”忽略掉。
另外在“where”元素中不需要考虑空格(“ ”)问题,因为MyBatis会智能帮助加上空格。

3.3.5 trim元素

该元素的主要功能是对其所包含的内容进行处理,其所拥有的设置属性:

  • prefix
    指定被包含内容中可以添加的前缀;
  • suffix
    指定被包含内容中可以添加的后缀;
  • prefixOverrides
    指定被包含内容的开始部分可被覆盖的内容;
  • suffixOverrides
    指定被包含内容的末尾部分可被覆盖的内容。

该元素可以代替“where”元素的功能,如:

<select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">  
    select * from t_blog   
    <trim prefix="where" prefixOverrides="and |or">  
        <if test="title != null">  
            title = #{title}  
        </if>  
        <if test="content != null">  
            and content = #{content}  
        </if>  
        <if test="owner != null">  
            or owner = #{owner}  
        </if>  
    </trim>  
</select>

3.3.6 set元素

该元素主要是用在更新操作,其主要功能与where元素差不多。
例如:

<update id="updateProductTypeDynamicById" parameterType="com.marshal.mybatis.entity.ProductType">
    update mshop_product_type_tbl
      <set>
          <if test="productTypeName != null and productTypeName !=''">
              product_type_name=#{productTypeName},
          </if>
          <if test="isValid != null and isValid != ''">
              is_valid=#{isValid},
          </if>
      </set>
      where id = #{id}
</update>

该元素会把结尾的逗号(“,”)忽略掉。
如果在“set”元素中的条件没有一个满足的话,即“set”中包含的内容为空时就会报错。

3.3.7 foreach元素

该元素主要用在查询的“in”条件中,是SQL语句中进行迭代的集合。
该元素的属性主要有:

  • collection
    该属性必须被指定,该属性有以下三中情况:
    当传入的参数类型是“List”的时候,“collection”属性值为“list”;
    当传入的参数类型是“Array”数组的时候,“collection”属性值为“array”;
    当传入的参数类型是“Map”的时候,“collection”属性值为“map”;

  • item
    指循环中当前的元素,配置的item的名字随意取;

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

  • open
    指定每次循环内容的开始部分。

  • separator
    指定每次迭代之间以什么符号作为分隔符。

  • close
    指定每次循环内容的结尾部分。

注意:由于一些数据库的SQL对执行的SQL长度有限制,所以使用foreach元素的时候需要预估collection对象的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值