原文地址: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. Java学习笔记之ArrayList基本用法

    原文地址,转载请注明出处:https://blog.csdn.net/GongchuangSu/article/details/51514389 ArrayList简介 ArrayList是一个其容量 ...

  2. STM32Cube填坑,ST link 下载一次以后无法下载

    ST link 下载一次以后无法下载, 原因是工程设置忘记设置Debug模式

  3. PHP LDA off 解决

    搭建完zabbix初始登录zabbix显示 PHP LDAP off 解决 不需要重新编译php 就可以增加 LDAP 模块 .首先进入自己的 PHP 安装目录中找到 ldap 文件夹 [root@b ...

  4. Spring 中如何自动创建代理(spring中的三种自动代理创建器)

    Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 . 具体是使用 BeanPostProcessor 来实现这项功能. 这三种自动代理创建器 为:Bean ...

  5. C++编译错误提示 [Error] name lookup of 'i' changed for ISO '

    在VC 6 中,i的作用域范围是函数作用域,在for循环外仍能使用变量i 即: for (int i = 0; i < n; ++i) {         //…… } cout<< ...

  6. 英特尔® Open Image Denoise 库有助于节省时间,提高质量

    在使用光线跟踪增强真实性与沉浸感时,游戏开发人员面临复杂的权衡.为了克服一系列挑战,英特尔创建了使用光线跟踪进行图像渲染的一整套解决方案,包含高性能开源滤波器.该解决方案已发布测试版,被集成至 Uni ...

  7. cocos2dx基础篇(7) 触碰事件

    cocos2dx游戏引擎的重点是在于移动设备的跨平台开发,而移动设备上的游戏大部分都是通过屏幕触碰来进行的.比如主菜单的按钮触碰,打飞机中飞机的触碰移动,都需要用到触碰操作.想一想之前讲的菜单按钮CC ...

  8. 20191209 Linux就该这么学(5)

    5. 用户身份与文件权限 5.1 用户的身份和能力 Linux 系统的管理员之所以是 root,并不是因为它的名字叫 root,而是因为该用户的身份号码即 UID( User IDentificati ...

  9. jinja2模板接受

    from flask import Flask,render_template app = Flask(__name__)#template_folder='templates',默认就是templa ...

  10. MySQL数据库的常见操作

    1.查看所有的数据库 1 show databases; 2.创建数据库  后面的时编码格式 1 create database dbName charset='utf8'; 3.使用/切换数据库 1 ...