【注:摘自MyBatis官网 】

1、动态SQL的元素:

2、if语句
 
  1. <select id="findActiveBlogWithTitleLike" resultType="Blog">
  2. SELECT * FROM BLOG
  3. WHERE state = ‘ACTIVE’
  4. <if test="title != null">
  5. AND title like #{title}
  6. </if>
  7. </select>
这条语句会提供一个可选的文本查找功能。如果你没有传递title,那么所有激活的博客都会被返回。但是如果你传递了title,那么就会查找相近的title(对于敏锐的检索,这中情况下你的参数值需要包含任意的遮掩或通配符)的博客。
 
假若我们想可选地搜索title 和author呢?首先,要改变语句的名称让它有意义。然后 简单加入另外的一个条件。
  1. <select id="findActiveBlogLike" resultType="Blog">
  2. SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  3. <if test="title != null">
  4. AND title like #{title}
  5. </if>
  6. <if test="author != null and author.name != null">
  7. AND author_name like #{author.name}
  8. </if>
  9. </select>
 
3、choose(when, otherwise)
 
有时我们不想应用所有的条件, 相反我们想选择很多情况下的一种。Java 中的switch和语句相似,MyBatis提供choose元素。
我们使用上面的示例,但是现在我们来搜索当title提供时仅有title 条件,当author提 供时仅有author条件。如果二者都没提供,只返回featured blogs。
 
  1. <select id="findActiveBlogLike"
  2. 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 author_name like #{author.name}
  10. </when>
  11. <otherwise>
  12. AND featured = 1
  13. </otherwise>
  14. </choose>
  15. </select>
【注:choose语句中的when是只要满足一个条件之后就放弃继续比较了,比较方式同Java中的Switch语句类似。】
 
4、trim(where, set)
 
考虑,多个动态查询条件情况:
  1. <select id="findActiveBlogLike" resultType="Blog">
  2. SELECT * FROM BLOG
  3. WHERE
  4. <if test="state != null">
  5. state = #{state}
  6. </if>
  7. <if test="title != null">
  8. AND title like #{title}
  9. </if>
  10. <if test="author != null and author.name != null">
  11. AND author_name like #{author.name}
  12. </if>
  13. </select>

如果这些条件都没有匹配上将会发生什么?这条 SQL 结束时就会成这样:

  1. SELECT * FROM BLOG
  2. WHERE

这会导致查询失败。如果仅仅第二个条件匹配是什么样的?这条 SQL 结束时就会是这 样:

  1. SELECT * FROM BLOG
  2. WHERE
  3. AND title like someTitle

这个查询也会失败。这个问题不能简单的用条件来解决,如果你从来没有这样写过,那 么你以后也不会这样来写。

MyBatis 有一个简单的处理,这在 90%的情况下都会有用。而在不能使用的地方,你可 以自定义处理方式。加上一个简单的改变,所有事情都会顺利进行:

  1. <select id="findActiveBlogLike" resultType="Blog">
  2. SELECT * FROM BLOG
  3. <where>
  4. <if test="state != null">
  5. state = #{state}
  6. </if>
  7. <if test="title != null">
  8. AND title like #{title}
  9. </if>
  10. <if test="author != null and author.name != null">
  11. AND author_name like #{author.name}
  12. </if>
  13. </where>
  14. </select>
where 元素知道如果由被包含的标记返回任意内容,就仅仅插入“WHERE” 。而且,如 果以“AND”或“OR”开头的内容,那么就会跳过WHERE不插入。
 
如果 where 元素没有做出你想要的,你可以使用 trim 元素来自定义。比如,和 where 元素相等的trim元素是:
  1. <trim prefix="WHERE" prefixOverrides="AND |OR ">
  2. ...
  3. </trim>
prefixOverrides属性采用管道文本分隔符来覆盖, 这里的空白也是重要的。它的结果就是移除在prefixOverrides属性中指定的内容,插入在with属性中的内容。
 
和动态更新语句相似的解决方案是set。set元素可以被用于动态包含更新的列,而不包含不需更新的。比如:
  1. <update id="updateAuthorIfNecessary">
  2. update Author
  3. <set>
  4. <if test="username != null">username=#{username},</if>
  5. <if test="password != null">password=#{password},</if>
  6. <if test="email != null">email=#{email},</if>
  7. <if test="bio != null">bio=#{bio}</if>
  8. </set>
  9. where id=#{id}
  10. </update>
这里,set 元素会动态前置 SET 关键字,而且也会消除任意无关的逗号,那也许在应用 条件之后来跟踪定义的值。
 
如果你对和这相等的trim元素好奇,它看起来就是这样的:
  1. <trim prefix="SET" suffixOverrides=",">
  2. ...
  3. </trim>
注意这种情况下我们覆盖一个后缀,而同时也附加前缀。
 
5、foreach
 
另外一个动态SQL通用的必要操作是迭代一个集合, 通常是构建在IN条件中的。
  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”作为键。
 
6、bind
 
bind元素允许你在自定义变量(不用符合OGNL规范),并且应用到上下文中。例如:
  1. <select id="selectBlogsLike" resultType="Blog">
  2. <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  3. SELECT * FROM BLOG
  4. WHERE title LIKE #{pattern}
  5. </select>

MyBatis动态SQL语法的更多相关文章

  1. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  2. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

  3. mybatis 动态sql和参数

    mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...

  4. MyBatis动态sql之${}和#{}区别

    前言 ​ 接触mybatis也是在今年步入社会之后,想想也半年多了,缺没时间去系统的学习,只知道大概,也是惭愧. ​ 不知道有多少刚毕业的同学和我一样,到现在还没仔仔细细去了解你每天都会见到使用到的框 ...

  5. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

  6. mybatis 动态sql语句(3)

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...

  7. mybatis 动态sql语句(1)

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...

  8. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

  9. MyBatis从入门到精通(第4章):MyBatis动态SQL【if、choose 和 where、set、trim】

    (第4章):MyBatis动态SQL[if.choose 和 where.set.trim] MyBatis 的强大特性之一便是它的动态 SQL.MyBatis 3.4.6版本采用了功能强大的OGNL ...

随机推荐

  1. JavaScript高级程序设计(第三版)学习笔记13、14章

    第13章,事件 事件冒泡 IE的事件叫做事件冒泡:由具体到不具体 <!DOCTYPE html> <html> <head>      <title>E ...

  2. Linux - 查看用户登录记录

    有关用户登录的信息记录在 utmp(/var/run/utmp).wtmp(/var/log/wtmp).btmp(/var/log/btmp) 和 lastlog(/var/log/lastlog) ...

  3. linux文件系统评估之inode

    存储系统上线前要做资源评估,通常需要在性能(即iops.带宽等)和容量维度进行业务评估:而具体到本地文件系统存储的容量时,需要根据具体业务对文件系统的可用数据空间和可用inode数进行评估,作者通过工 ...

  4. MongoDB的主从复制和副本集

    mongoDB的两个特性主从复制和副本集,实现了数据的同步备份 一.主从复制 主从复制是一个简单的数据库同步备份的集群技术.例如主服务器宕机了,可以直接使用从服务器,主服务器恢复后在进行同步,保证了业 ...

  5. web开发常用图片格式

    web开发常用图片格式有:gif   jpg/jpeg    png gif:图片压缩率高,可以显示动画,但是只能显示256色,可能造成颜色丢失. jpg:图片压缩率高(有损压缩),可以用小文件来显示 ...

  6. iOS开发——企业证书(免审核 299$)

    (最近准备考试……空闲截图整理成博客)

  7. Microsoft Word Regular Expression

    Microsoft Word Regular Expression Word裏的正則表達式-不一樣的符號. 一.Normal Find and Replace 二.Search by using wi ...

  8. Codevs 1535 封锁阳光大学

    1535 封锁阳光大学 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大 ...

  9. indeed 第二次笔试题

    1. Maximal Values 很简单,从前往后扫,找满足的,O(n),很容易就过掉了. maxn = 100. 没啥难点. 2. Bi-gram 用map统计个数,从前往后扫,每2个字符作为一个 ...

  10. [翻译][MVC 5 + EF 6] 11:实现继承

    原文:Implementing Inheritance with the Entity Framework 6 in an ASP.NET MVC 5 Application 1.选择继承映射到数据库 ...