原文地址:http://www.cnblogs.com/dongying/p/4092662.html

传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误。Mybatis的动态SQL功能正是为了解决这种问题,其通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率。下面就去感受Mybatis动态SQL的魅力吧:

1. if:    你们能判断,我也能判断!

作为程序猿,谁不懂 if !  在mybatis中也能用 if 啦:

  1. <select id="findUserById" resultType="user">
  2.            select * from user where
  3.            <if test="id != null">
  4.                id=#{id}
  5.            </if>
  6.             and deleteFlag=0;
  7. </select>

上面例子:如果传入的id 不为空,那么才会SQL才拼接id = #{id}。这个相信大家看一样就能明白,不多说。

细心的人会发现一个问题:"你这不对啊!要是你传入的id为null,  那么你这最终的SQL语句不就成了 select * from user where and deleteFlag=0,  这语句有问题!"

是啊,这时候,mybatis的 where 标签就该隆重登场啦:

2. where, 有了我,SQL语句拼接条件神马的都是浮云!

咱们通过where改造一下上面的例子:

  1. <select id="findUserById" resultType="user">
  2.            select * from user
  3.            <where>
  4.                <if test="id != null">
  5.                    id=#{id}
  6.                </if>
  7.                and deleteFlag=0;
  8.            </where>
  9.  </select>

有些人就要问了: "你这都是些什么玩意儿!跟上面的相比,不就是多了个where标签嘛!那这个还会不会出现  select * from user where and deleteFlag=0 ?"

的确,从表面上来看,就是多了个where标签而已,不过实质上, mybatis是对它做了处理,当它遇到AND或者OR这些,它知道怎么处理。其实我们可以通过 trim 标签去自定义这种处理规则。

3. trim :  我的地盘,我做主!

上面的where标签,其实用trim 可以表示如下:

  1. <trim prefix="WHERE" prefixOverrides="AND |OR ">
  2.   ...
  3. </trim>

它的意思就是:当WHERE后紧随AND或则OR的时候,就去除AND或者OR。除了WHERE以外,其实还有一个比较经典的实现,那就是SET。

4. set:  信我,不出错!

  1. <update id="updateUser" parameterType="com.dy.entity.User">
  2.            update user set
  3.            <if test="name != null">
  4.                name = #{name},
  5.            </if>
  6.            <if test="password != null">
  7.                password = #{password},
  8.            </if>
  9.            <if test="age != null">
  10.                age = #{age}
  11.            </if>
  12.            <where>
  13.                <if test="id != null">
  14.                    id = #{id}
  15.                </if>
  16.                and deleteFlag = 0;
  17.            </where>
  18. </update>

问题又来了: "如果我只有name不为null,  那么这SQL不就成了 update set name = #{name}, where ........ ?  你那name后面那逗号会导致出错啊!"

是的,这时候,就可以用mybatis为我们提供的set 标签了。下面是通过set标签改造后:

  1. <update id="updateUser" parameterType="com.dy.entity.User">
  2.            update user
  3.         <set>
  4.           <if test="name != null">name = #{name},</if>
  5.              <if test="password != null">password = #{password},</if>
  6.              <if test="age != null">age = #{age},</if>
  7.         </set>
  8.            <where>
  9.                <if test="id != null">
  10.                    id = #{id}
  11.                </if>
  12.                and deleteFlag = 0;
  13.            </where>
  14. </update>

这个用trim 可表示为:

  1. <trim prefix="SET" suffixOverrides=",">
  2.   ...
  3. </trim>

WHERE是使用的 prefixOverrides(前缀), SET是使用的 suffixOverrides (后缀),看明白了吧!

5. foreach:  你有for, 我有foreach, 不要以为就你才屌!

java中有for, 可通过for循环,同样, mybatis中有foreach, 可通过它实现循环,循环的对象当然主要是java容器和数组。

  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>

将一个 List 实例或者数组作为参数对象传给 MyBatis,当这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以"list"作为键,而数组实例的键将是"array"。同样,当循环的对象为map的时候,index其实就是map的key。

6. choose:  我选择了你,你选择了我!

Java中有switch,  mybatis有choose。

  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>

以上例子中:当title和author都不为null的时候,那么选择二选一(前者优先),如果都为null, 那么就选择 otherwise中的,如果tilte和author只有一个不为null, 那么就选择不为null的那个。

纵观mybatis的动态SQL,强大而简单,相信大家简单看一下就能使用了。

Mybatis 动态sql(转载)的更多相关文章

  1. 深入浅出Mybatis系列(九)---强大的动态SQL(转载)

    原文出处:http://www.cnblogs.com/dongying/p/4092662.html 上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.r ...

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

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

  3. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

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

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

  5. Mybatis动态SQL单一基础类型参数用if标签

    Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...

  6. 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...

  7. Mybatis动态SQL简单了解 Mybatis简介(四)

    动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ }   Mybatis应用中,S ...

  8. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  9. mybatis 动态sql和参数

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

随机推荐

  1. Ruby小白入门笔记之<Rails项目目录结构>

    一 .流程分析 二.目录分析 DemoRails app (核心) assets  (web前端所需文件) images       (图片) javascripts  (JS代码) styleshe ...

  2. OpenFlow Switch 1.3 规范

    目录 文章目录 目录 OpenFlow 架构 OpenFlow 标准和规范 OpenFlow 的端口(Port) OpenFlow 的流表(Flow Table) OpenFlow 的组表(Group ...

  3. 四十八:数据库之alembic常用命令和经典错误的解决办法

    常用命令:1.init:创建一个alembic仓库2.reversion:创建一个新的版本3.--autogenerate:自动将当前模型的修改,生成迁移脚本4.-m:message,可以记录本次迁移 ...

  4. 十七:jinja2之宏

    宏有点类似于函数,接收一些数据,进行处理,但是没有返回值,可以将一些常用的代码片段放到宏中,然后把不固定的值抽出来做变量 使用maacro来定义宏,使用宏的时候,参数可以设默认值 自定义一个input ...

  5. python中利用队列asyncio.Queue进行通讯详解

    python中利用队列asyncio.Queue进行通讯详解 本文主要给大家介绍了关于python用队列asyncio.Queue通讯的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细 ...

  6. java:Spring框架4(Project,ER图)

    1.Project: ER图: applicationContext.xml: <?xml version="1.0" encoding="UTF-8"? ...

  7. WinForm和WPF中注册热键

    由于.Net没有提供专门的类库处理热键,所以需要直接调用windows API来解决. HotKey为.NET调用Windows API的封装代码,主要是RegisterHotKey和Unregist ...

  8. USACO4.1 Fence Loops【最小环&边->点转化】

    数据不是很大,如果要转换为正常的那种建图方式的话,可以给点进行标号,用一个二维数组存这两条边相交的那个点的标号,方便处理.一定要注意不要同一个点使用不同的编号也不要不同的点使用同一个编号(这不是废话嘛 ...

  9. angular - ngFor, trackby

    ngFor ngForOf指令通常使用缩写形式*ngFor为集合中的每个项呈现模板的结构指令.该指令放置在元素上,该元素将成为克隆模板的父级. <li *ngFor="let item ...

  10. (转)HashMap底层实现原理

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...