需求缘起:
对于XML配置方法大家比较熟悉,为了文章系列的完整性,在这里也简单的介绍下。
本章的大纲:
(2)if+where的条件判断
(3)if+set的更新语句
(4)if+trim代替where/set标签
(5)choose (when, otherwise)
(6)foreach
接下来看下具体的内容:
(1)if标签
if标签可用在许多类型的sql语句中,我们以查询为例。首先看一个很普通的查询:
<select id="select1" resultMap="baseResultMap"> select *from demo where name = #{name} and email = #{email} </select>
但是此时如果name或email为null,此语句很可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断,增加灵活性。
DemoMapper的代码很简单:
/**test if */ public List<Demo> select1(Demo demo);
Demo.xml代码修改为使用if test:
<select id="select1" resultMap="baseResultMap"> select *from demo where <if test="name != null and name != ''"> name = #{name} </if> <if test="email != null and email != ''"> and email=#{email} </if> </select>
访问http://127.0.0.1:8080/select1?name=王五 能正常访问,
但是如果访问:
http://127.0.0.1:8080/select1 或者 http://127.0.0.1:8080/select1?emai=aa@qq.com
一运行就报错了。这时候where标签就出现了,所以技术就有存在的道理。
(2)if+where的条件判断
当where中的条件使用的if标签较多时,这样的组合可能会导致错误。上面的查询语句中,当访问:http://127.0.0.1:8080/select1?email=aa@qq.com 参数name为null,将不会进行name列的判断,则会直接导“WHERE AND”关键字多余的错误SQL。
这时我们可以使用where动态语句来解决。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
上面的<select>修改为如下:
<select id="select1" resultMap="baseResultMap"> select *from demo <where> <if test="name != null and name != ''"> name = #{name} </if> <if test="email != null and email != ''"> and email=#{email} </if> </where> </select>
此时访问的话,会构造不同的SQL语句:
访问1:http://127.0.0.1:8080/select1
select *from demo
访问2:http://127.0.0.1:8080/select1?name=王五
select *from demo WHERE name = ?
访问3:http://127.0.0.1:8080/select1?email=aa@qq.com
select *from demo WHERE email=?
访问5:http://127.0.0.1:8080/select1?name=王五&email=aa@qq.com
select *from demo WHERE name = ? and email=?
都非常的完美。
(3)if+set的更新语句
当update语句中没有使用if标签时,如果有一个参数为null,都会导致错误。
当在update语句中使用if标签时,如果前面的if没有执行,则会导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
使用if+set标签修改后,如果某项为null则不进行更新,而是保持数据库原值。如下示例:
<update id="update1"> update demo <set> <if test="name != null and name != ''"> name = #{name}, </if> <if test="email != null and email != ''"> email=#{email} </if> </set> where id = #{id} </update>
这样就可以单独修改name或者email,或者是同时修改name和email,但是需要注意,如果什么都不修改的话是会报错的。
(4)if+trim代替where/set标签
trim是更灵活的去处多余关键字的标签,它可以实践where和set的效果。
(4.1)trim 代替where
<select id="select2" resultMap="baseResultMap"> select *from demo <trim prefix="where" prefixOverrides="and|or"> <if test="name != null and name != ''"> name = #{name} </if> <if test="email != null and email != ''"> and email=#{email} </if> </trim> </select>
(4.1)trim 代替set
<update id="update2"> update demo <trim prefix="set" suffixOverrides=","> <if test="name != null and name != ''"> name = #{name}, </if> <if test="email != null and email != ''"> email=#{email} </if> </trim> where id = #{id} </update>
(5)choose (when, otherwise)
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为true,就会执行if标签中的条件。MyBatis提供了choose 元素。if标签是与(and)的关系,而choose标签是或(or)的关系。
choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
例如下面例子,同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的test为true的sql执行。安全考虑,我们使用where将choose包起来,放置关键字多于错误。
<select id="select3" resultMap="baseResultMap"> select *from demo <where> <choose> <when test="name != null and name != ''"> name = #{name} </when> <when test="email != null and email != ''"> and email=#{email} </when> <otherwise> </otherwise> </choose> </where> </select>
访问测试:
访问1:http://127.0.0.1:8080/select3
select *from demo
访问2:http://127.0.0.1:8080/select3?name=王五
select *from demo where name = ?
访问3:http://127.0.0.1:8080/select3?email=aa@qq.com
select *from demo WHERE email = ?
访问4:http://127.0.0.1:8080/select3?name=王五&email=aa@qq.com
select *from demo WHERE name = ?
这里满足了name != null and name != ''的条件,所以条件就是name=?。
(6)foreach
对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件。List 实例将使用“list”做为键,数组实例以“array” 做为键。
foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。
注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。
(6.1)参数为array示例的写法
接口方法的声明:
/**foreach: 参数为array示例的写法*/ public List<Demo> select3(String[] ids);
动态SQL语句:
<select id="select4" resultMap="baseResultMap"> select *from demo where id in <foreach collection="array" item="id" open="(" separator="," close=")"> #{id} </foreach> </select>
(6.2)参数为List示例的写法
接口方法声明:
/**foreach: 数为list示例的写法*/ public List<Demo> select5(List<Integer> list);
动态SQL语句:
<select id="select5" resultMap="baseResultMap"> select *from demo where id in <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </select>
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
相关推荐
《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot以其简洁的配置和快速的启动特性,已经成为构建微服务应用的首选框架。而MyBatis作为一款强大的持久层框架,深受开发者喜爱,它提供了灵活的SQL映射...
《Spring Boot集成MyBatis详解》 在现代Java开发领域,Spring Boot以其便捷的初始化、自动配置和微服务架构等特点,已经成为主流的开发框架。而MyBatis作为一款优秀的持久层框架,以其灵活的SQL映射和易于使用的...
`spring-boot-starter-mybatis`是Spring Boot为MyBatis提供的一站式解决方案,它包含MyBatis核心库、MyBatis-Spring以及相关的依赖,使得开发者无需手动管理这些依赖,只需简单配置即可实现MyBatis的集成。...
《Spring Boot集成MyBatis详解:以2.3.0版本为例》 Spring Boot作为一款快速开发框架,极大地简化了Java应用的初始化和配置过程。而MyBatis作为一款优秀的持久层框架,以其灵活的SQL操作和良好的注解支持,深受...
《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot和MyBatis作为两个极为流行的框架,常被用于构建高效、简洁的Web应用程序。本文将深入探讨如何使用Spring Boot 2.2.2版本集成MyBatis,以及相关的配置...
`spring-boot-starter-mybatis`是Spring Boot为MyBatis提供的一个starter,它包含了MyBatis、MyBatis-Spring、以及相关的依赖,使得开发者可以方便地在Spring Boot项目中使用MyBatis。在`pom.xml`或`build.gradle`...
《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot框架因其便捷的配置、自动化的特性以及丰富的生态而广受欢迎。同时,MyBatis作为一款轻量级的持久层框架,以其灵活的SQL映射和优秀的性能,被大量项目...
《Spring Boot集成MyBatis详解:基于spring-boot-starter-mybatis-2.1.3》 在Java开发领域,Spring Boot...在实际开发中,还可以利用Spring Boot的自动化配置和MyBatis的动态SQL功能,进一步提升开发效率和代码质量。
在实际开发中,Spring Boot与MyBatis的整合还可以涉及到更多高级特性的使用,例如MyBatis的动态SQL、缓存、结果映射等。同时,Spring Boot还提供了对事务的自动管理,使得在多数据源环境下也能轻松处理事务。总的来...
《Spring Boot 3.0.1 集成 MyBatis 深度解析与实践指南》 在当今快速发展的Java开发领域,Spring Boot以其简洁的配置和强大的功能深受开发者喜爱。而MyBatis作为一款优秀的持久层框架,简化了数据库操作,使得数据...
《Spring Boot集成MyBatis详解:基于1.3.4版本》 在现代Java开发领域,Spring Boot以其简洁、高效和快速启动的特点深受开发者喜爱。而MyBatis作为一款轻量级的持久层框架,提供了灵活的SQL操作,使得数据库访问更加...
《Spring Boot集成MyBatis详解:基于spring-boot-starter-mybatis-2.1.4》 在现代Java开发中,Spring Boot以其简化配置、快速启动的优势成为主流框架。而MyBatis作为轻量级持久层框架,以其灵活的SQL映射和强大的...
《Spring Boot集成MyBatis详解:以spring-boot-starter-mybatis-2.3.1为例》 在现代Java开发中,Spring Boot以其简洁、高效的特点成为首选框架,而MyBatis作为轻量级的持久层框架,也因其灵活的数据访问能力受到...
值得注意的是,Spring Boot 2.0.1相较于之前的版本,引入了一些新的特性和改进,如更好的Actuator支持、对Java 9的兼容性以及Spring Framework 5的升级,这些都可能影响到MyBatis的集成和使用。因此,在实际项目中,...
在微服务架构中,Spring Boot与MyBatis的结合更是常见,因为MyBatis作为轻量级的持久层框架,提供了灵活的SQL映射机制,可以方便地进行数据访问。本文将深入探讨Spring Boot如何与MyBatis集成,并重点解析1.1.1版本...
《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot以其简洁的配置和快速的应用启动而备受青睐。MyBatis作为一款优秀的持久层框架,简化了数据库操作,使得开发者能够更加专注于业务逻辑。当Spring Boot...
4. **动态SQL**:MyBatis的动态SQL功能强大,可以根据条件动态生成SQL,极大地提高了代码的可读性和可维护性。 5. **MyBatis Plus**:MyBatis的增强工具,提供了丰富的CRUD操作,简化了开发工作。 四、最佳实践 1...
1. 添加依赖:在`pom.xml`或`build.gradle`中,引入`spring-boot-starter-mybatis`依赖,这将包含MyBatis的核心库和Spring Boot的自动配置支持。 ```xml <groupId>org.springframework.boot <artifactId>spring-...
《Spring Boot集成MyBatis详解:基于spring-boot-starter-mybatis-2.2.2》 在现代Java开发中,Spring Boot以其简化配置、快速启动的特性,深受开发者喜爱。而MyBatis作为轻量级的持久层框架,以其灵活的SQL映射和...
《Spring Boot集成MyBatis详解:从1.3.1版本到最新实践》 Spring Boot以其简化配置、快速启动的特点,成为了Java开发领域的热门框架。而MyBatis作为一款轻量级的持久层框架,以其灵活的SQL映射和优秀的性能,同样受...