原文地址: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. flutter dialog

    flutter Dialog import 'dart:math'; import 'package:flutter/material.dart'; import 'test.dart'; impor ...

  2. ORACLE官方全托管驱动 Oracle.ManagedDataAccess 12.1.0.1.0

    以前用Oracle的时候,必须得装他臃肿的客户端,网上虽然也有提供直连Oracle的驱动,但也是要收费的,最近Oracle终于开窍了,提供了官方的全托管驱动. 这次是随Oracle ODAC 12c  ...

  3. Elasticsearch 为何要在 7.X版本中 去除type 的概念

    背景说明 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...

  4. SVN的使用和问题解决方法总结

    添加仓库之类的很简单,这里就不说了哈...不会的可以问问我,当然百度再快了..嘿嘿 1.从服务器Check Out代码: 2.提交代码: 3.你是不是今天和我一样纠结如何删除已经上传SVN的内容,其实 ...

  5. Java基础面试题集(一)

    Java基础面试题 一.面向对象编程(OOP) 7 二.常见的Java问题 7 2.1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 7 2.2.JDK和JRE的区别是什么? ...

  6. Ubuntu基础设定:openssh-server安装和使用

    记录一下Ubuntu17.10的openssh-server的安装和使用.安装之后就可以使用ssh登陆Ubuntu了,所以是Ubuntu的基础设定之一. 事前准备 Ubuntu版本:17.10 dev ...

  7. Kafka sender消息生产者

    1.pom文件引入Kafka依赖(我用的版本是2.2.2.RELEASE) <dependency> <groupId>org.springframework.kafka< ...

  8. 【VS开发】cmd dos 批处理重命名文件

    原文地址:http://hi.baidu.com/benchoi/item/c1f531f5f1367b0b85d2785b 批处理实现文件批量重命名并自动加递增序列号 有时我们想把一些图片批量重命名 ...

  9. 【VS开发】文件夹和文件选择EditBrowe控件使用

    让EditBrowse控件既能浏览文件,又能浏览文件夹... 下图是在http://www.codeproject.com/Articles/35722/MFC-Feature-Pack-CMFCEd ...

  10. Java第六周实验+总结

    一.实验目的 (1)掌握类的继承 1.子类继承父类中非private的成员变量和成员方法,同时,注意构造方法不能被子类继承. 2.定义类时若缺省extends关键字,则所定义的类为java.lang. ...