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.参考 ...
随机推荐
- [Usaco2008 Dec]Hay For Sale 购买干草[01背包水题]
Description 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包 ...
- 多线程编程中使用pthread_create内存泄露问题
//tls5源代码: #include <stdio.h> #include <unistd.h> #include <string.h> #include &qu ...
- EL表达式与三目运算符
在页面实现常量替换,比如 entity.auditi 的值如果为0显示不需要否则显示需要 因为需求就这两个值 所以使用三目运算符比较简洁 如果值为很多个 可使用if else进行判断 ${entit ...
- java遍历Set集合
class Person{ private String name; private int age; public Person(String name,int age){ this.name = ...
- (Java 多线程系列)java volatile详解
在前面的文章里面介绍了synchronized关键字的用法,这篇主要介绍volatile关键字的用法. Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其它 ...
- hadoop集群安装
首现非常感谢 虾皮(http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503949.html) 安装过程是参照他的<Hadoop集群(第5期 ...
- .NET程序集1
谈谈.NET程序集(一) 谈谈.NET程序集(一) The Assembly in .NET by 唐小崇 http://www.cnblogs.com/tangchong 在.NET出现之前, Wi ...
- 关于ToolStrip设置Location无效的问题
问题现象 当多个ToolStrip使用ToolStripContainer布局时,可以让用户自己拖动工具栏,所以在程序关闭时必须保存用户拖动工具栏的位置,但是在再次打开程序后,还原回来的工具栏位置会有 ...
- jQuery+JSON+jPlayer实现QQ空间音乐查询
演示地址: http://bejson.com/demos/qqmusic/ 代码下载:http://www.jqdemo.com/932.html 查询QQ音乐是很早前就出来的一个接口. 这里使用j ...
- linux 原生系统发送电子邮件 (在本地与因特网)
有用的资料在 Linux mail 命令 http://www.cnblogs.com/JemBai/archive/2012/01/24/2329136.html 还有这里 Linux系统下mail ...