首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Mybatis学习笔记(6)

2013-12-23 
Mybatis学习笔记(六)动态SQL通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言

Mybatis学习笔记(六)
动态SQL
通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中。
MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。

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

if
在动态SQL中所做的最通用的事情是包含部分where字句的条件。比如:

?

[html]?view plaincopy
  1. <select?id=”findActiveBlogWithTitleLike”??
  2. ????parameterType=”Blog”?resultType=”Blog”>??
  3. ????????SELECT?*?FROM?BLOG??
  4. ????????WHERE?state?=??ACTIVE???
  5. ????????<if?test=”title?!=?null”>??
  6. ????????????AND?title?like?#{title}??
  7. ????????</if>??
  8. </select>??

choose, when, otherwise
和Java中的switch语句相似,MyBatis提供choose元素。
[html]?view plaincopy
  1. <select?id=”findActiveBlogLike”??
  2. ????parameterType=”Blog”?resultType=”Blog”>??
  3. ????????SELECT?*?FROM?BLOG?WHERE?state?=??ACTIVE???
  4. ????????<choose>??
  5. ????????????<when?test=”title?!=?null”>??
  6. ????????????????AND?title?like?#{title}??
  7. ????????????</when>??
  8. ????????????<when?test=”author?!=?null?and?author.name?!=?null”>??
  9. ????????????????AND?title?like?#{author.name}??
  10. ????????????</when>??
  11. ????????????<otherwise>??
  12. ????????????????AND?featured?=?1??
  13. ????????????</otherwise>??
  14. ????????</choose>??
  15. </select>??

trim, where, set
上面的例子中如果把“state = ?ACTIVE?”也设置为动态的话就有可能出现问题。所以,
[html]?view plaincopy
  1. <select?id=”findActiveBlogLike”??
  2. ????????parameterType=”Blog”?resultType=”Blog”>??
  3. ????SELECT?*?FROM?BLOG??
  4. ????<where>??
  5. ????????<if?test=”state?!=?null”>??
  6. ????????????state?=?#{state}??
  7. ????????</if>??
  8. ????????<if?test=”title?!=?null”>??
  9. ????????????AND?title?like?#{title}??
  10. ????????</if>??
  11. ????????<if?test=”author?!=?null?and?author.name?!=?null”>??
  12. ????????????AND?title?like?#{author.name}??
  13. ????????</if>??
  14. ????</where>??
  15. </select>??
where元素知道如果由被包含的标记返回任意内容,就仅仅插入“WHERE”。而且,如果以“AND”或“OR”开头的内容,那么就会跳过WHERE不插入。
如果where元素没有做出你想要的,你可以使用trim元素来自定义。比如,和where元素相等的trim元素是:[html]?view plaincopy
  1. <trim?prefix="WHERE"?prefixOverrides="AND?|OR?">??
  2. …??
  3. </trim>??
overrides属性采用管道文本分隔符来覆盖,这里的空白也是重要的。它的结果就是移除在overrides属性中指定的内容,插入在with属性中的内容。
和动态更新语句相似的解决方案是set。set元素可以被用于动态包含更新的列,而不包含不需更新的。比如:
[html]?view plaincopy
  1. <update?id="updateAuthorIfNecessary"??
  2. ????????parameterType="domain.blog.Author">??
  3. ????update?Author??
  4. ????<set>??
  5. ????????<if?test="username?!=?null">username=#{username},</if>??
  6. ????????<if?test="password?!=?null">password=#{password},</if>??
  7. ????????<if?test="email?!=?null">email=#{email},</if>??
  8. ????????<if?test="bio?!=?null">bio=#{bio}</if>??
  9. ????</set>??
  10. ????where?id=#{id}??
  11. </update>??
这里,set元素会动态前置SET关键字,而且也会消除任意无关的逗号,那也许在应用条件之后来跟踪定义的值。
如果你对和这相等的trim元素好奇,它看起来就是这样的:
[html]?view plaincopy
  1. <trim?prefix="SET"?suffixOverrides=",">??
  2. …??
  3. </trim>??
注意这种情况下我们覆盖一个后缀,而同时也附加前缀。

foreach
另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的。比如:
[html]?view plaincopy
  1. <select?id="selectPostIn"?resultType="domain.blog.Post">??
  2. ????SELECT?*??
  3. ????FROM?POST?P??
  4. ????WHERE?ID?in??
  5. ????<foreach?item="item"?index="index"?collection="list"??
  6. ????????????open="("?separator=","?close=")">??
  7. ????????#{item}??
  8. ????</foreach>??
  9. </select>??
foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。
注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。

热点排行