动态 SQL(Dynamic SQL)
MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的
经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在
columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。
尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中
使用强大的动态SQL来改进这些状况。
动态SQL元素对于任何使用过JSTL或者类似于XML之类的文本处理器的人来说,都是非常熟悉
的。在上一版本中,需要了解和学习非常多的元素,但在MyBatis 3 中有了许多的改进,现在只
剩下差不多二分之一的元素。MyBatis使用了基于强大的OGNL表达式来消除了大部分元素。
•
if
•
choose (when, otherwise)
•
trim (where, set)
•
foreach
if 元素
动态 SQL 最常做的事就是有条件地包括 where 子句。例如:
<select id=”findActiveBlogWithTitleLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
MyBatis 3 - User Guide
47
<if test=”title != null”>
AND title like #{title}
</if>
</select>
这条语句提供一个带功能性的可选的文字。如果您没有传入标题,那么将返回所有激活的
Blog。如果您传入了一个标题,那它就会查找与这个标题匹配的Blog(在这种情况下,您的参数
值可能需要包括任何masking或者通配符)。
如果我们想要可选地根据标题或者作者查询怎么办?首先,我把语句的名称稍稍改一下,使
得看起来更直观。然后简单地加上另外一个条件。
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
</select>
choose, when, otherwise 元素
有时候我们不想应用所有的条件,而是想从多个选项中选择一个。与java 中的 switch 语句
相似,MyBatis 提供了一个 choose 元素。
让我们继续使用上面的例子,但这次我们只搜索有提供查询标题的,或者只搜索有提供查询
作者的数据。如果两者都没有提供,那只返回加精的Blog (可能是管理员有选择性的查询,而不
是返回大量无意义的随机的Blog)。
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test=”title != null”>
AND title like #{title}
</when>
<when test=”author != null and author.name != null”>
AND title like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
MyBatis 3 - User Guide
48
trim, where, set 元素
考虑一下我们上面提到的‘if ’的例子中,如果现在我们把‘ACTIVE=1’也做为条件,会发
生什么情况。
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
WHERE
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
</select>
如果我们一个条件都不设置,会发生什么呢?语句最终可能会变成这个样子:
SELECT * FROM BLOG
WHERE
这将会执行失败。如果只有第二个条件满足呢?语句最终会变成这样:
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’
这同样会执行失败。这个问题仅用条件很难简单地解决,如果您已经这么写了,那您可能以
后永远都不想犯这样的错了。
MyBatis有个简单的方案能解决这里面90%的问题。如果where没有出现的时候,您可以自定一
个。修改一下,就能完全解决:
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
<where>
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
MyBatis 3 - User Guide
49
</where>
</select>
where 元素知道插入“where”如果它包含的标签中有内容返回的话。此外,如果返回的内容
以“AND” 或者 “OR”开头,它会把“AND” 或者 “OR”去掉。
如果 where 元素的行为并没有完全按您想象的那样,您还可以使用trim 元素来自定义。例
如,下面的trim 与 where 元素实现相同功能:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
…
</trim>
overrides属性使用了管道分隔的文本列表来覆写,而且它的空白也不能忽略的。这样的结果
是移出了指定在overrides 属性里字符,而在开头插入prefix属性中指定的字符。
译者注,下面的两种配置方法效果是一样的:
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
<where>
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
</if>
</where>
</select>
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
< trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND title like #{author.name}
MyBatis 3 - User Guide
50
在动态update语句里相似的解决方式叫做set,这个set元素能够动态地更新列。例如:
<update id="updateAuthorIfNecessary"
parameterType="domain.blog.Author">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>
set 元素将动态的配置 SET 关键字,也用来剔除追加到条件末尾的任何不相关的逗号。
您想知道等同的 trim 元素该怎么写吧,它就像这样 :
<trim prefix="SET" suffixOverrides=",">
…
</trim>
注意这种情况,我们剔除了一个后缀, 同时追加了一个前缀。
Foreach 元素
另一个动态 SQL 经常使用到的功能是集合迭代,通常用在 IN 条件句。例如:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
</if>
</ trim >
</select>
下面的使用SET 元素也类似。
译者注:
MyBatis 3 - User Guide
51
foreach 元素非常强大,允许您指定一个集合,申明能够用在元素体内的项和索引变量。也
允许您指定开始和结束的字符,也可以加入一个分隔符到迭代器之间。这个元素的聪明之处在于
它不会意外地追加额外的分隔符。
� 注意: 您可以把一个 List 实例或者一个数组作为一个参数对象传递给MyBatis。如果您
这么做,MyBatis 会自动将它包装成一个Map,并以名字作为key。List 实例会以
“list”作为 key,array 实例会以“ array” 作为key。
关于 XML 配置文件及XML 映射文件就讨论到这了,下一章节我们将详细讨论 Java API。
- 浏览: 189257 次
- 性别:
- 来自: 北京
最新评论
-
ZZX19880809:
没看到有[x] Received 'hello word!0' ...
rabbitmq学习3:Publish/Subscribe -
ZZX19880809:
根本就没有. 应该输入first message.
rabbitmq学习2:Work Queues -
jiaofuyou:
独孤日日也 写道我亲自试验了并没有实现啊,第一个worker输 ...
rabbitmq学习2:Work Queues -
独孤日日也:
我亲自试验了并没有实现啊,第一个worker输出: Wait ...
rabbitmq学习2:Work Queues -
jiaofuyou:
想问个问题,象这种任务分发的工作队列,你举的例子是一个队列被多 ...
rabbitmq学习2:Work Queues
相关推荐
- **动态SQL**:MyBatis的动态SQL功能非常强大,可以在XML或注解中直接编写条件语句,根据变量动态生成SQL。 - **映射器(Mapper)**:映射器接口定义了数据库操作的方法,通过SqlSession调用这些方法,MyBatis会...
MyBatis Generator(MBG)是一个强大的工具,用于自动生成MyBatis的SQL映射文件、Java模型类和DAO接口。这个"mybatis-generator-demo.zip"压缩包包含了一个使用MBG的示例项目,帮助开发者了解如何配置和使用MBG。在...
同时,官方文档也提供了详尽的教程和API参考,方便开发者学习和使用。 总的来说,MyBatis-3.5.6是一个强大而灵活的Java持久层框架,它降低了数据库操作的复杂性,使得开发者可以专注于业务逻辑,而不是繁琐的数据...
本教程“mybatis学习01-入门”将引导初学者逐步掌握 MyBatis 的基本概念、安装与配置,以及如何在实际项目中应用。 首先,我们需要了解 MyBatis 的核心概念: 1. **SqlSessionFactory**: 这是 MyBatis 的核心工厂...
mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中...《MyBatis-Plus入门文档》主要介绍了MyBatis-Plus入门使用,以及关于mybatis-plus的更多介绍及特性,感兴趣的可以下载学习一下
本示例项目 "mybatis-plus-demo" 是一个简单的 MyBatis-Plus 入门教程,旨在帮助开发者快速了解并掌握 MyBatis-Plus 的基本用法。 1. **MyBatis-Plus 简介** MyBatis-Plus 是 MyBatis 的轻量级框架,它在 MyBatis ...
Mybatis-Plus官方提供了详细的API文档和使用教程,方便开发者快速上手和深入学习。 综上,"auto-mybatis-new-me.zip"提供的新版本Mybatis-Plus数据库生成工具将使开发者在数据库操作上更得心应手,同时通过自定义...
提到的 PDF 文档可能是 MyBatis-Spring 的官方用户指南,涵盖了详细的配置示例、使用教程和常见问题解答,对于学习和使用该框架非常有帮助。 综上所述,`mybatis-spring-1.0.1-bundle` 包含了集成 MyBatis 与 ...
本教程通过一系列视频讲解,旨在帮助学习者全面掌握Mybatis的核心概念和技术。 首先,1.《尚硅谷_MyBatis_简介.avi》会介绍Mybatis的基本概念和历史背景,解释为什么需要这样的框架,以及Mybatis相较于其他ORM框架...
MyBatis Generator(MBG)是一个强大的工具,用于生成MyBatis映射器接口、XML配置文件以及Java实体...同时,这个压缩包还可能是对IMOOC网站上相关教程的补充材料,帮助学习者更好地理解和实践MyBatis Generator的使用。
MyBatis支持动态SQL,使得在处理复杂查询时更加灵活。它与Spring框架结合使用时,可以实现声明式事务管理,提高代码的健壮性。 **jd-gui** 是一个Java反编译工具,用于查看Java字节码并将其转换为源代码形式。...
3. **映射文件**:Mybatis的映射文件是实现SQL动态绑定的核心,视频详细讲解了如何编写映射文件,包括不同的参数处理规则,如#取值时指定参数的相关规则。 4. **resultMap**:resultMap是Mybatis中的一个重要元素,...
在这一系列教程中,讲师通过清晰的讲解和实例演示,帮助学习者掌握Mybatis的关键特性。 首先,教程从第11集开始介绍Mybatis的全局配置文件。这部分讲解了如何配置databaseIdProvider,这是为了支持多数据库环境,让...
在本项目"整合mybatis-spring-boot-2.0-shiro-thymeleaf"中,开发者提供了一个简短但全面的教程,适用于那些刚开始接触这些技术的初学者。这个项目结合了四个关键组件:MyBatis、Spring Boot、Shiro以及Thymeleaf,...
1. 动态SQL:通过`<if>`, `<choose>`, `<when>`, `<otherwise>`, `<trim>`, `<where>`, `<set>`等标签实现动态构建SQL。 2. 自动映射:MyBatis可以根据字段名自动匹配Java对象属性,简化开发。 3. ResultMap:自定义...
mybatis-3.3.1.pdf可能是一个官方的用户手册或指南,提供了关于MyBatis 3.3.1的详细使用教程和最佳实践。 总的来说,MyBatis 3.3.1的这个压缩包提供了完整的运行环境和开发工具,便于开发者快速搭建基于Spring的...
每一个知识点都有案例进行演示学习,最终通过学习你将全面掌握MP的使用,从而使Mybatis的的开发更加的高效,达到事半功倍的效果。 适应人群 有一定的Java以及Mybatis框架的基础。 从0开始全面讲解Mybatis-Plus框架...
"Mybatis系列课程-Association"显然是一个专门针对Mybatis中“关联”这一概念的教程。在本课程中,我们将深入探讨Mybatis如何处理实体类之间的关联关系,以及如何通过XML或注解配置来实现这种关联。 首先,我们需要...
这些视频教程将帮助学习者深入理解Mybatis的动态SQL特性,提高在实际项目中的应用能力,无论是对于初学者还是有经验的开发者,都是宝贵的参考资料。通过观看和实践,可以更好地掌握Mybatis在处理复杂查询和更新场景...
本教程将详细讲解如何使用Spring Boot 2.7.0和MyBatis框架搭建多数据源配置,以实现灵活的数据管理。 首先,我们需要了解Spring Boot的核心特性,它是一个基于Spring框架的微服务开发工具,简化了配置并提供了自动...