MyBatis 学习-动态 SQL 篇
-
IF 元素
这条查询语句中,如果没有传入 userName 参数,那么查询出所有 valid 等于 1 的记录。反之,如果传入了 userName 参数,则查询出 valid = 1 和 userName 符合查询条件的记录。另外需要确保生成 SQL 后 where 关键字后必须有查询条件存在。
<select id="selectProjectList" parameterType="ProjectInfo" resultType="ProjectInfo">
SELECT
<include refid="columns"></include>
FROM
t_project_001_project_info
WHERE
valid = 1
<if test="userName != null">
AND
user_name LIKE '%' #{userName} '%'
</if>
</select>
CHOOSE 元素
有些时候,我们并不是想用到所有条件语句,而是只从其中选择一个。针对这种情况 Mybatis 提供了类似 Java 中的 switch 语句的 choose 元素。
还是用查询 SQL 为例,如果查询条件提供了 userName 就按 userName 查询,如果提供了nickName 就按 nickName 查询,如果两者都没有提供就返回所有有效的记录(或是符合其他条件的记录,为简单起见,这里就返回所有有效记录)。
<select id="queryByName" parameterType="ProjectInfo" resultType="ProjectInfo">
SELECT
<include refid="columns"></include>
FROM
t_project_001_project_info
WHERE
user_type_id = 1
<choose>
<when test="userName != null">user_name like '%' #{userName} '%'</when>
<when test="nickName != null">nick_name like '%' #{nickName} '%'</when>
<otherwise>is_valid = 1</otherwise>
</choose>
</select>
FOREACH 元素
这个元素的使用场景是在需要对一个集合进行遍历的时候使用,如批量删除、批量插入等语句。
<!-- 根据传入的Id值列表,删除多条记录 -->
<delete id="deleteBatch" parameterType="java.util.List">
DELETE FROM
t_project_001_project_info
WHERE
user_id
IN
<foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
</delete>
我们知道 Mybatis 进行 SQL 映射时,传入参数只能有一个,如果想传入多个参数,只能使用 Java 的 List 或是 Array 进行封装后再传入。上面的语句就是将要删除的多条记录的 Id 值放在了 List 对象中传入。
foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串(上例中的 open 和 close 属性)以及在迭代中间放置分隔符(separator 属性)。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。
我们可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当我们这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。
WHERE 元素
WHERE 这个元素可以避免在查询语句中出现只有 WHERE 关键字而没有作何查询条件的情况出现
<select id="queryByName" parameterType="User" resultType="User">
SELECT
<include refid="columns"></include>
FROM
t_project_001_project_info
<where>
<if test="userName != null">user_name LIKE '%' #{userName} '%'</if>
<if test="nickName != null"> OR nick_name LIKE '%' #{userName} '%'</if>
</where>
</select>
Mybatis 会判断只有在 WHERE 元素中至少有一个条件成立时,才会在查询语句中添加 WHERE 关键字。
在上述 SQL 语句中,如果第一个条件不成立,而第二个条件成立时,是不是会在 WHERE 语句中多个 OR 关键字呢?完全不心担心这个问题,Mybatis 早已考虑到了,她会将多余的 AND 或是 OR 关键字自动剔除掉(所谓多余,紧跟在 WHERE 关键字后的第一个 AND 或是 OR )。
SET 元素
SET 元素和 WHERE 元素类似,只是她是使用在数据更新语句中而已。
<!-- 更新用户信息,并写回到数据表中 -->
<update id="udpateProject" parameterType="User">
UPDATE
t_project_001_project_info
<set>
<if test="userName != null">user_name = #{userName},</if>
<if test="englishName != null">english_name = #{englishName},</if>
<if test="nickName != null">nick_name = #{nickName},</if>
<if test="userTypeId != null">user_type_id = #{userTypeId},</if>
<if test="isValid != null">is_valid = #{isValid}</if>
</set>
WHERE user_id = #{userId}
</update>
-
MyBatis 学习-动态 SQL 篇的更多相关文章
- Mybatis学习--动态SQL
		学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html MyBatis 的强大特性之一便是它的动态 SQL. ... 
- MyBatis学习——动态SQL
		开发人员在使用JDBC框架或者其他类似的框架进行数据库开发时,通常都要根据需求去手动拼接SQL,这样非常麻烦,而myBatis提供了对SQL语句动态组装的功能,恰好解决了这一问题. 一,动态SQL中的 ... 
- Mybatis解析动态sql原理分析
		前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ... 
- Java-MyBatis:MyBatis 3 动态 SQL
		ylbtech-Java-MyBatis:MyBatis 3 动态 SQL 1.返回顶部 1. 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架 ... 
- MyBatis 构造动态 SQL 语句
		以前看过一个本书叫<深入浅出 MFC >,台湾 C++ 大师写的一本书.在该书中写到这样一句话,“勿在浮沙筑高台”,这句话写的的确对啊.编程很多语言虽然相通,但是真正做还是需要认真的学习, ... 
- MyBatis 示例-动态 SQL
		MyBatis 的动态 SQL 包括以下几种元素: 详细的使用参考官网文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 本章内容简单描述这 ... 
- MyBatis的动态SQL详解
		MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ... 
- mybatis 使用动态SQL
		RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ... 
- MyBatis框架——动态SQL、缓存机制、逆向工程
		MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ... 
随机推荐
- Asp.Net Web API 2(CRUD操作)第二课
			Asp.Net Web API 2(CRUD操作)第二课 Asp.Net Web API 导航 Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok ... 
- [转]unload dynamic library needs two dlclose() calls?
			src: http://stackoverflow.com/questions/8793099/unload-dynamic-library-needs-two-dlclose-calls Quest ... 
- TOGAF架构能力框架之架构能力建设和架构治理
			TOGAF架构能力框架之架构能力建设和架构治理 为了确保架构功能在企业中能够被成功地运用,企业需要通过建立适当的组织结构.流程.角色.责任和技能来实现其自身的企业架构能力,而这也正是TOGAF的架构能 ... 
- web-worker计数器,根据输入时间统计次数
			1.用web-worker实现:另起一个线程,将计数工作运行在后台的JavaScript文件,并返回累加后的结果. 该js文件运行于后台,独立于其他脚本,不会影响页面的性能.html页面可以继续做任何 ... 
- 转载:JavaScript多线程编程简介
			虽然有越来越多的网站在应用AJAX技术进行开发,但是构建一个复杂的AJAX应用仍然是一个难题.造成这些困难的主要原因是什么呢?是与服务器的异步通信问题?还是GUI程序设计问题呢?通常这两项工作都是由桌 ... 
- U盘安装CentOS 6.4 + Windows 7双系统 (Windows 7下安装 CentOS 6.4)
			最近在看<鸟哥私房菜:基础学习篇>,觉得很不错,想要装个windows 7 和 CentOS 6.4 双系统,在网上找了很多教程,觉得乱七八糟的,弄得很复杂,而且很多都不是很完整,对于新手 ... 
- 【Chrome】如何在C++中增加给JavaScript调用的API
			本文示例说明了如何在Chrome浏览器中增加JavaScript API.为了简化,先假设是在已有的namespace中增加一个新的API,文章的最后将指出如果增加一下全新的namespace所需注意 ... 
- php的curl封装类
			之前一直做爬虫相关的,每次自己去写一系列curl_setopt()函数太繁琐,我于是封装了如下curl请求类. <?php /** * @author freephp * @date 2015- ... 
- Magnum Kuernetes源码分析(二)
			Kubernetes Master Stack kubernetes master的stack的resources主要分为三个部分. master wait handle wait handle主要用 ... 
- C#中的集合类——ArrayList
			1. ArrayList与数组 数组的长度不可变,元素的类型单一: ArrayList 实际上相当于一个可变长度的动态数组,由于集合中的元素都是object类型,元素的类型可以有多种了:与数组一样, ... 
