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.参考 ...
随机推荐
- 协作图(通信图)collaboration diagram
协作图(通信图)collaboration diagram 系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) [UM ...
- CODEFORCES#274 DIV2
A[傻逼题] 大意:给你a,b,c三个数,你可以在其中加上括号,加号,乘号,使得到的值最大 就是问你 a+b+c,a*(b+c),(a+b)*c,a*b*c,(a+c)*b 哪个最大! 我去...这不 ...
- js call方法
js call call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, ...
- .net下将富文本编辑器文本原样读入word文档
关键词:富文本编辑器 生成word 样式 为了解决标题中提出的问题,首选需要了解,在.net环境下读取数据库中的内容动态生成word至少有2种方式,[方式一]一种方式是在项目中添加引用,例如在“添 ...
- 调用MobileAPI的设计(iOS篇)
调用MobileAPI的设计(iOS篇) 这一节讲如何发起网络请求. iOS用于调用MobileAPI的第三方组件很多,我们这里采用的是以下组件: 1)ASIHTTPRequest,用于请求Mobil ...
- Android开发中与服务器交互时,遇到java.io.IOException: Target host must not be null的问题
当我遇到这个问题的时候,也在网上查找好半天.找到了一个和这个问题很类似的问题——java.lang.IllegalStateException: Target host must not be nul ...
- AppDomain卸载与代理
AppDomain卸载与代理 涉及内容: 反射与MEF解决方案 AppDomain卸载与代理 WinForm.WcfRestService示 插件系统的基本目的是实现宿主与组件的隔离,核心是作为接驳约 ...
- shell脚本获取随机数random
用C提供的取随机数的方法srand和rand, 前者是给后者设置随机数种子seed. ; srand(seed); // time(NULL) 通常使用时间做种子 rnd_num = rand(); ...
- 设计模式之 - 外观模式 (Facade design pattern)
1. 模式意图: 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更容易使用. 2. 结构 3. 工厂方法模式C#实现 using System; ...
- 识别Andriod APK签名证书类型
转载请注明出处 根据已知Google证书的序列号来识别APK使用哪种证书签名的 目前只列出google原生签名,其他私有签名均视为presigned #!/bin/bash # Grab cert. ...