`

151. Spring Boot MyBatis升级篇-XML-动态SQL(if test)

阅读更多

 

 

需求缘起

       对于XML配置方法大家比较熟悉,为了文章系列的完整性,在这里也简单的介绍下。

 

本章的大纲:

(1)if标签
(2)if+where的条件判断
(3)if+set的更新语句
(4)if+trim代替where/set标签
(5)choose (when, otherwise)
(6)foreach

 

 

       接下来看下具体的内容:

1if标签

if标签可用在许多类型的sql语句中,我们以查询为例。首先看一个很普通的查询:

     <select id="select1" resultMap="baseResultMap">
        select *from demo where
           name = #{name} and email = #{email}
     </select>

 

但是此时如果nameemailnull,此语句很可能报错或查询结果为空。此时我们使用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标签就出现了,所以技术就有存在的道理。

 

2if+where的条件判断

where中的条件使用的if标签较多时,这样的组合可能会导致错误。上面的查询语句中,当访问:http://127.0.0.1:8080/select1?email=aa@qq.com 参数namenull,将不会进行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语句:

访问1http://127.0.0.1:8080/select1

select *from demo

访问2http://127.0.0.1:8080/select1?name=王五 

select *from demo WHERE name = ?

访问3http://127.0.0.1:8080/select1?email=aa@qq.com 

select *from demo WHERE email=?

访问5http://127.0.0.1:8080/select1?name=王五&email=aa@qq.com

select *from demo WHERE name = ? and email=?

       都非常的完美。

 

3if+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,或者是同时修改nameemail,但是需要注意,如果什么都不修改的话是会报错的。

 

4if+trim代替where/set标签

trim是更灵活的去处多余关键字的标签,它可以实践whereset的效果。

4.1trim 代替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.1trim 代替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>

 

 

5choose (when, otherwise)

有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为true,就会执行if标签中的条件。MyBatis提供了choose 元素。if标签是与(and)的关系,而choose标签是或(or)的关系

       choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql类似于Java switch 语句chooseswitchwhencaseotherwise则为default

       例如下面例子,同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的testtruesql执行。安全考虑,我们使用wherechoose包起来,放置关键字多于错误。

    <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>

 

访问测试:

访问1http://127.0.0.1:8080/select3

select *from demo

访问2http://127.0.0.1:8080/select3?name=王五  

select *from demo where name = ?

访问3http://127.0.0.1:8080/select3?email=aa@qq.com

select *from demo WHERE email = ?

访问4http://127.0.0.1:8080/select3?name=王五&email=aa@qq.com

select *from demo WHERE name = ?

       这里满足了name != null and name != ''的条件,所以条件就是name=?

 

6foreach

对于动态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-starter-mybatis-spring-boot-1.0.2.zip

    《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot以其简洁的配置和快速的启动特性,已经成为构建微服务应用的首选框架。而MyBatis作为一款强大的持久层框架,深受开发者喜爱,它提供了灵活的SQL映射...

    spring-boot-starter-mybatis-spring-boot-1.3.3.tar.gz

    《Spring Boot集成MyBatis详解》 在现代Java开发领域,Spring Boot以其便捷的初始化、自动配置和微服务架构等特点,已经成为主流的开发框架。而MyBatis作为一款优秀的持久层框架,以其灵活的SQL映射和易于使用的...

    spring-boot-starter-mybatis-spring-boot-2.1.2.zip

    `spring-boot-starter-mybatis`是Spring Boot为MyBatis提供的一站式解决方案,它包含MyBatis核心库、MyBatis-Spring以及相关的依赖,使得开发者无需手动管理这些依赖,只需简单配置即可实现MyBatis的集成。...

    spring-boot-starter-mybatis-spring-boot-2.3.0.tar.gz

    《Spring Boot集成MyBatis详解:以2.3.0版本为例》 Spring Boot作为一款快速开发框架,极大地简化了Java应用的初始化和配置过程。而MyBatis作为一款优秀的持久层框架,以其灵活的SQL操作和良好的注解支持,深受...

    spring-boot-starter-mybatis-spring-boot-2.2.2.zip

    《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot和MyBatis作为两个极为流行的框架,常被用于构建高效、简洁的Web应用程序。本文将深入探讨如何使用Spring Boot 2.2.2版本集成MyBatis,以及相关的配置...

    spring-boot-starter-mybatis-spring-boot-1.3.4.zip

    `spring-boot-starter-mybatis`是Spring Boot为MyBatis提供的一个starter,它包含了MyBatis、MyBatis-Spring、以及相关的依赖,使得开发者可以方便地在Spring Boot项目中使用MyBatis。在`pom.xml`或`build.gradle`...

    spring-boot-starter-mybatis-spring-boot-1.3.1.zip

    《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot框架因其便捷的配置、自动化的特性以及丰富的生态而广受欢迎。同时,MyBatis作为一款轻量级的持久层框架,以其灵活的SQL映射和优秀的性能,被大量项目...

    spring-boot-starter-mybatis-spring-boot-2.1.3.zip

    《Spring Boot集成MyBatis详解:基于spring-boot-starter-mybatis-2.1.3》 在Java开发领域,Spring Boot...在实际开发中,还可以利用Spring Boot的自动化配置和MyBatis的动态SQL功能,进一步提升开发效率和代码质量。

    spring-boot-starter-mybatis-spring-boot-2.1.0.tar.gz

    在实际开发中,Spring Boot与MyBatis的整合还可以涉及到更多高级特性的使用,例如MyBatis的动态SQL、缓存、结果映射等。同时,Spring Boot还提供了对事务的自动管理,使得在多数据源环境下也能轻松处理事务。总的来...

    spring-boot-starter-mybatis-spring-boot-3.0.1.zip

    《Spring Boot 3.0.1 集成 MyBatis 深度解析与实践指南》 在当今快速发展的Java开发领域,Spring Boot以其简洁的配置和强大的功能深受开发者喜爱。而MyBatis作为一款优秀的持久层框架,简化了数据库操作,使得数据...

    spring-boot-starter-mybatis-spring-boot-1.3.4.tar.gz

    《Spring Boot集成MyBatis详解:基于1.3.4版本》 在现代Java开发领域,Spring Boot以其简洁、高效和快速启动的特点深受开发者喜爱。而MyBatis作为一款轻量级的持久层框架,提供了灵活的SQL操作,使得数据库访问更加...

    spring-boot-starter-mybatis-spring-boot-2.1.4.tar.gz

    《Spring Boot集成MyBatis详解:基于spring-boot-starter-mybatis-2.1.4》 在现代Java开发中,Spring Boot以其简化配置、快速启动的优势成为主流框架。而MyBatis作为轻量级持久层框架,以其灵活的SQL映射和强大的...

    spring-boot-starter-mybatis-spring-boot-2.3.1.tar.gz

    《Spring Boot集成MyBatis详解:以spring-boot-starter-mybatis-2.3.1为例》 在现代Java开发中,Spring Boot以其简洁、高效的特点成为首选框架,而MyBatis作为轻量级的持久层框架,也因其灵活的数据访问能力受到...

    spring-boot-starter-mybatis-spring-boot-2.0.1.tar.gz

    值得注意的是,Spring Boot 2.0.1相较于之前的版本,引入了一些新的特性和改进,如更好的Actuator支持、对Java 9的兼容性以及Spring Framework 5的升级,这些都可能影响到MyBatis的集成和使用。因此,在实际项目中,...

    spring-boot-starter-mybatis-spring-boot-1.1.1.tar.gz

    在微服务架构中,Spring Boot与MyBatis的结合更是常见,因为MyBatis作为轻量级的持久层框架,提供了灵活的SQL映射机制,可以方便地进行数据访问。本文将深入探讨Spring Boot如何与MyBatis集成,并重点解析1.1.1版本...

    spring-boot-starter-mybatis-spring-boot-2.3.0.zip

    《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot以其简洁的配置和快速的应用启动而备受青睐。MyBatis作为一款优秀的持久层框架,简化了数据库操作,使得开发者能够更加专注于业务逻辑。当Spring Boot...

    spring-boot-starter-mybatis-spring-boot-2.1.4.zip

    4. **动态SQL**:MyBatis的动态SQL功能强大,可以根据条件动态生成SQL,极大地提高了代码的可读性和可维护性。 5. **MyBatis Plus**:MyBatis的增强工具,提供了丰富的CRUD操作,简化了开发工作。 四、最佳实践 1...

    spring-boot-starter-mybatis-spring-boot-3.0.0.zip

    1. 添加依赖:在`pom.xml`或`build.gradle`中,引入`spring-boot-starter-mybatis`依赖,这将包含MyBatis的核心库和Spring Boot的自动配置支持。 ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-...

    spring-boot-starter-mybatis-spring-boot-2.2.2.tar.gz

    《Spring Boot集成MyBatis详解:基于spring-boot-starter-mybatis-2.2.2》 在现代Java开发中,Spring Boot以其简化配置、快速启动的特性,深受开发者喜爱。而MyBatis作为轻量级的持久层框架,以其灵活的SQL映射和...

    spring-boot-starter-mybatis-spring-boot-1.3.1.tar.gz

    《Spring Boot集成MyBatis详解:从1.3.1版本到最新实践》 Spring Boot以其简化配置、快速启动的特点,成为了Java开发领域的热门框架。而MyBatis作为一款轻量级的持久层框架,以其灵活的SQL映射和优秀的性能,同样受...

Global site tag (gtag.js) - Google Analytics