动态SQL官方使用参考
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
if
满足条件再执行<if>标签内容
if标签的test属性满足ognl表达式
在 MyBatis 中常见的 OGNL 表达式如下:
- e1 or e2:或关系
- e1 and e2:与关系
- e1 == e2 或者 e1 eq e2:相等
- e1 != e2 或者 e1 neq e2:不等
- e1 lt e2 ;e1 < e2;e1 gt e2;e1 > e2;e1 lte e2;e1 <= e2;e1 gte e2;e1 >= e2:比较关系
- e1 + e2;e1 – e2;e1 * e2;e1 / e2;e1 % e2:运算关系
- !e 或者 not e:非,取反
- e.method(args):调用对象方法
- e.property:访问属性值
- e1[e2]:访问数组、链表(e2 为序号)或者 Map(e2 为键值)
其中 1~4 以及 9~10 都是特别常用的几种情况,而其它的情况不利于 SQL 的维护,因此并不常见。
<select id="ifTest" resultType="studentDto" >
select
id,name,age,hobby
from student where 1 = 1
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
复制代码
where
where标签可以避免出现多个and的情况。会自动把第一个查询条件的and改成where。多用于查询条件当中
<select id="whereTest" resultType="studentDto" >
select
id,name,age,hobby
from student
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
复制代码
choose when otherwise
choose when otherwise是一起使用的等同于jaca的 cswitch case default
<select id="chooseWhenOtherwiseTest" resultType="studentDto" >
select
id,name,age,hobby
from student
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
<choose>
<when test="name!=null">
order by name desc
</when>
<otherwise>
order by age asc
</otherwise>
</choose>
</select>
复制代码
foreach
类似于一次java集合的遍历
属性 | 作用 |
---|---|
collection | 代表传入集合字段 |
item | 每次遍历的别名 |
open | foreach操作开始时的前缀 |
separator | 每次遍历后元素之间的分隔符 |
close | 遍历完成后的后缀 |
index | 每次遍历的下标别名 |
<select id="foreachTest" resultType="studentDto" >
select
id,name,age,hobby
from student
<where>
<if test="ids != null">
AND id in
<foreach collection="ids" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
<choose>
<when test="name!=null">
order by name desc
</when>
<otherwise>
order by age asc
</otherwise>
</choose>
</select>
复制代码
bind
将一个传递进来的值绑定到新的值上面。比如模糊查询
<select id="bindTest" resultType="org.apache.ibatis.mytest.StudentDto">
select
id,name,age,hobby
from student
<where>
<if test="ids != null">
AND id in
<foreach collection="ids" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="name != null">
<bind name="likeName" value="'%'+name+'%'" ></bind>
AND name like #{likeName}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
<choose>
<when test="name!=null">
order by name desc
</when>
<otherwise>
order by age asc
</otherwise>
</choose>
复制代码
set
set标签多用于修改操作 在表名后加上set 并且去掉多余的, 比如age = #{age}, 这里的,
<update id="setTest" >
update student
<set>
<if test="id != null">
id = #{id},
</if>
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</set>
</update>
复制代码
trim
mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。
属性 | 描述 |
---|---|
prefix | 给sql语句拼接的前缀 |
suffix | 给sql语句拼接的后缀 |
prefixOverrides | 去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定 |
suffixOverrides | 去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定 |
<insert id="trimTest" >
<trim prefix="insert into student(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="age != null">
age,
</if>
</trim>
<trim prefix=" values(" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id},
</if>
<if test="name != null">
#{name},
</if>
<if test="age != null">
#{age},
</if>
</trim>
</insert>
复制代码