您的位置:首页 > 数据库

MyBatis学习笔记(四)--动态SQL的使用

2017-11-25 21:57 169 查看
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:

1. if 语句 (简单的条件判断)
2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
5. set (主要用于更新时)
6. foreach (在实现 mybatis in 语句查询时特别有用)

1.if语句
动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分
比如:
<select id="searchStudents" parameterType="Map" resultMap="StudentResult">
select * from t_student

where gradeId=#{gradeId}
<if test="name!=null">
and name like #{name}
</if>
<if test="age!=nulll">
and age=#{age}
</if>
</select>
这条语句提供了一个可选的文本查找类型的功能。如果没有传入“name”,那么就不会添加第一条and语句;反之若传入了“name”,那么就会把模糊查找“name”,“age”的判断也类似。

2.choose, when, otherwise
有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
比如:
<select id="searchStudents2" parameterType="Map" resultMap="StudentResult">
select * from t_student

<choose>
<when
test="searchBy=='gradeId'">
where gradeId=#{gradeId}
</when>
<when
test="searchBy=='name'">
where name like #{name}
</when>
<otherwise>
where age=#{age}
</otherwise>
</choose>

</select>
注:这里的searchBy是自定义的字符串

3.where
“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以 AND 或OR 开头的,则它会剔除掉'where'。
比如:
<select id="searchStudents3" parameterType="Map" resultMap="StudentResult">
select * from t_student

<where>
<if test="gradeId!=null">
gradeId=#{gradeId}
</if>
<if test="name!=null">
and name like #{name}
</if>
<if test="age!=nulll">
and age=#{age}
</if>
</where>
</select>

4.set条件
当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值。自动加上set,自动删除最后一个逗号

比如:
<update id="updateStudent" parameterType="Student">
update t_student
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="age!=null">
age=#{age},
</if>
</set>
where id=#{id}
</update>

5.trim条件
trim 是更灵活用来去处多余关键字的标签,它可以用来实现 where 和 set 的效果。
比如:

<select id="searchStudents4" parameterType="Map" resultMap="StudentResult">
select * from t_student

<trim prefix="where" prefixOverrides="and|or">
<if test="gradeId!=null">
gradeId=#{gradeId}
</if>
<if test="name!=null">
and name like #{name}
</if>
<if test="age!=nulll">
and age=#{age}
</if>
</trim>
</select>
其中prefix表示在前面自动添加‘where’
prefixOverrides表示去掉第一个and或者or
同理:suffix表示后缀,在最后添加;suffixOverrides表示去掉最后一个and或者or

6.foreach语句
动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。比如:
<select id="searchStudents5" parameterType="Map" resultMap="StudentResult">
select * from t_student

<if test="gradeIds!=null">
<where>
gradeId in

<foreach item="gradeId" collection="gradeIds"
open="(" separator="," close=")">
#{gradeId}
</foreach>
</where>
</if>
</select>
foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹
9311
配的字符串以及在迭代中间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: