MyBatis的动态SQL基于 OGNL 表达式,可以很方便的在SQL语句中辅助实现逻辑。
3.3.1 实现动态SQL的元素
MyBatis中实现动态SQL的元素:
- if
- choose(when,otherwise)
- trim
- where
- set
- foreach
3.3.2 if元素
该元素适用于简单的判断,利用if语句可以实现某些简单的条件选择。
原符号 | < | <= | > | >= | & | ‘ | “ |
---|---|---|---|---|---|---|---|
替换符号 | < | <= | > | >= | & | ' | " |
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对象的长度。