-

IF 元素

  这条查询语句中,如果没有传入 userName 参数,那么查询出所有 valid 等于 1 的记录。反之,如果传入了 userName 参数,则查询出 valid = 1 和 userName 符合查询条件的记录。另外需要确保生成 SQL 后 where 关键字后必须有查询条件存在。

  1. <select id="selectProjectList" parameterType="ProjectInfo" resultType="ProjectInfo">
  2. SELECT
  3. <include refid="columns"></include>
  4. FROM
  5. t_project_001_project_info
  6. WHERE
  7. valid = 1
  8. <if test="userName != null">
  9. AND
  10. user_name LIKE '%' #{userName} '%'
  11. </if>
  12. </select>

CHOOSE 元素

  有些时候,我们并不是想用到所有条件语句,而是只从其中选择一个。针对这种情况 Mybatis 提供了类似 Java 中的 switch 语句的 choose 元素。

还是用查询 SQL 为例,如果查询条件提供了 userName 就按 userName 查询,如果提供了nickName 就按 nickName 查询,如果两者都没有提供就返回所有有效的记录(或是符合其他条件的记录,为简单起见,这里就返回所有有效记录)。

  1. <select id="queryByName" parameterType="ProjectInfo" resultType="ProjectInfo">
  2. SELECT
  3. <include refid="columns"></include>
  4. FROM
  5. t_project_001_project_info
  6. WHERE
  7. user_type_id = 1
  8. <choose>
  9. <when test="userName != null">user_name like '%' #{userName} '%'</when>
  10. <when test="nickName != null">nick_name like '%' #{nickName} '%'</when>
  11. <otherwise>is_valid = 1</otherwise>
  12. </choose>
  13. </select>

FOREACH 元素

  这个元素的使用场景是在需要对一个集合进行遍历的时候使用,如批量删除、批量插入等语句。

  1. <!-- 根据传入的Id值列表,删除多条记录 -->
  2. <delete id="deleteBatch" parameterType="java.util.List">
  3. DELETE FROM
  4. t_project_001_project_info
  5. WHERE
  6. user_id
  7. IN
  8. <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
  9. #{item}
  10. </foreach>
  11. </delete>

  我们知道 Mybatis 进行 SQL 映射时,传入参数只能有一个,如果想传入多个参数,只能使用 Java 的 List 或是 Array 进行封装后再传入。上面的语句就是将要删除的多条记录的 Id 值放在了 List 对象中传入。

  foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串(上例中的 open 和 close 属性)以及在迭代中间放置分隔符(separator 属性)。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。

  我们可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当我们这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。

WHERE 元素

  WHERE 这个元素可以避免在查询语句中出现只有 WHERE 关键字而没有作何查询条件的情况出现

  1. <select id="queryByName" parameterType="User" resultType="User">
  2. SELECT
  3. <include refid="columns"></include>
  4. FROM
  5. t_project_001_project_info
  6. <where>
  7. <if test="userName != null">user_name LIKE '%' #{userName} '%'</if>
  8. <if test="nickName != null"> OR nick_name LIKE '%' #{userName} '%'</if>
  9. </where>
  10. </select>

  Mybatis 会判断只有在 WHERE 元素中至少有一个条件成立时,才会在查询语句中添加 WHERE 关键字。

  在上述 SQL 语句中,如果第一个条件不成立,而第二个条件成立时,是不是会在 WHERE 语句中多个 OR 关键字呢?完全不心担心这个问题,Mybatis 早已考虑到了,她会将多余的 AND 或是 OR 关键字自动剔除掉(所谓多余,紧跟在 WHERE 关键字后的第一个 AND 或是 OR )。

SET 元素

  SET 元素和 WHERE 元素类似,只是她是使用在数据更新语句中而已。

  1. <!-- 更新用户信息,并写回到数据表中 -->
  2. <update id="udpateProject" parameterType="User">
  3. UPDATE
  4. t_project_001_project_info
  5. <set>
  6. <if test="userName != null">user_name = #{userName},</if>
  7. <if test="englishName != null">english_name = #{englishName},</if>
  8. <if test="nickName != null">nick_name = #{nickName},</if>
  9. <if test="userTypeId != null">user_type_id = #{userTypeId},</if>
  10. <if test="isValid != null">is_valid = #{isValid}</if>
  11. </set>
  12. WHERE user_id = #{userId}
  13. </update>

-

MyBatis 学习-动态 SQL 篇的更多相关文章

  1. Mybatis学习--动态SQL

    学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html MyBatis 的强大特性之一便是它的动态 SQL. ...

  2. MyBatis学习——动态SQL

    开发人员在使用JDBC框架或者其他类似的框架进行数据库开发时,通常都要根据需求去手动拼接SQL,这样非常麻烦,而myBatis提供了对SQL语句动态组装的功能,恰好解决了这一问题. 一,动态SQL中的 ...

  3. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  4. Java-MyBatis:MyBatis 3 动态 SQL

    ylbtech-Java-MyBatis:MyBatis 3 动态 SQL 1.返回顶部 1. 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架 ...

  5. MyBatis 构造动态 SQL 语句

    以前看过一个本书叫<深入浅出 MFC >,台湾 C++ 大师写的一本书.在该书中写到这样一句话,“勿在浮沙筑高台”,这句话写的的确对啊.编程很多语言虽然相通,但是真正做还是需要认真的学习, ...

  6. MyBatis 示例-动态 SQL

    MyBatis 的动态 SQL 包括以下几种元素: 详细的使用参考官网文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 本章内容简单描述这 ...

  7. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  8. mybatis 使用动态SQL

    RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...

  9. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

随机推荐

  1. github上写个人简历

    随笔- 70  文章- 0  评论- 567  在github上写个人简历——先弄个主页   起因 不知道园友们在使用智联招聘等网站填写简历的时候对要求输入的内容有没有一种无力感,不吐槽了反正就一句话 ...

  2. 默认python2.6切换成python27

    # 安装修改pythonyum -y install python27 python27-devel python -V; python2.6 -V     # 查看当前python版本 这两个应该都 ...

  3. Python 用POP接收邮件

    一.简介 POP(Post Office Protocal)最长用的POP版本是POP3,因此本文是以POP3为主.POP3非常简单,可以用来从邮件服务器上下载邮件,然后删除这些邮件.功能非常有限,后 ...

  4. GDB-Darwin-Extentions

  5. 如何将 Area 中的 Controller 放到独立的程序集?

    目录 背景如何将 Area 中的 Controller 放到独立的程序集?备注 背景返回目录 本文假设您已经熟悉了 ASP.NET MVC 的常规开发方式.执行模型和关键扩展点,这里主要说一下如何使用 ...

  6. algorithm(算法)

    algorithm(算法) STL中算可以分为三种, 1.变序型队列算法,可以改变容器内的数据: 2.非变序型队列算法,处理容器内的数据而不改变他们 : 3.通用数值算法,这涉及到很多专业领域的算术操 ...

  7. Google 域名的秘密

    声明:本文采用 BY-NC-SA 协议进行授权. 转载请注明转自:Google 域名的秘密 哈哈,我也标题党一回. 其实也不算是秘密,只能说是我在制作 https://github.com/lenny ...

  8. IT职位分析

    人才市场的IT职位分析   最近要找长沙的工作,于是通过湖南人才市场搜索了一下职位.结果得到的数据让我很难比较,作为一个 IT 业滚爬了多年的程序员,对这样的搜索结果很不满意.于是,我不得不自己来整理 ...

  9. HTML5-WebSocket-初探

    1.环境准备 主要是用<HTML5 程序设计>(第二版)作为学习参考资料.但是上面用的WebSocket服务器是用python写的.偶不懂python,于是得找另外一个替代实现,这里适用n ...

  10. jQuery Validation让验证变得如此容易(一)

    一.官网下载jquery,和jquery validation plugin http://jqueryvalidation.org/ 二.引入文件 <script src="js/j ...