【Mybatis】(七)动态SQL的元素

简介: 【Mybatis】(七)动态SQL的元素

文章目录


动态SQL简介

Mybatis中的动态SQL元素

一、if_where标签

二、set标签

三、trim标签

四、choose_when_otherwise标签

五、foreach标签


动态SQL简介


MyBatis的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。


有些时候,SQL语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。使用Oracle的序列、mySQL的函数生成Id。


这时我们可以使用动态SQL。利用动态SQL 这一特性可以彻底摆脱这种痛苦。通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。动态 SQL 元素和使用 JSTL 或其他类似基于 XML的文本处理器相似。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。


Mybatis中的动态SQL元素


  • <if>:使用if实现简单的条件判断。
  • <where>:简化SQL语句中的where的条件判断。
  • <choose>( when、otherwise ):相当Java的 swith ,满足条件将会跳出。
  • <set>:解决动态更新语句。
  • <trim>:可以灵活的去除多余的关键字。
  • <foreach>:迭代一个集合,通常用于in条件。


一、if_where标签


1、<if> 标签 用于条件判断,test 表示条件表达式。


2、where标签(用于动态判断)


给里面的内容动态添加 where 关键字前缀;否则反之。


只会去除第一个多出来的 and 或者 or 。

<select id="findStuByBlurry" resultType="Student">
    select * from student
    <where>
        <if test="stuName != null and stuName != ''">
            and stuName like concat('%',#{stuName},'%')
        </if>
        <if test="stuAge != null and stuAge != ''">
            and stuAge = #{stuAge}
        </if>
        <if test="stuSex != null and stuSex != ''">
            and stuSex = #{stuSex}
        </if>
    </where>
</select>


二、set标签


标签:


根据内容是否为空动态添加 set 关键字。


标签内容内最后面多余的逗号。

<update id="updateStuOne" paramterType="Student">
    update student
    <set>
        <if test="stuName != null |stuName!=''">
            stuName = #{stuName},
        </if>
        <if test="stuAge != null |stuAge!=''">
            stuAge  = #{stuAge},
        </if>
        <if test="stuSex != null |stuSex!=''">
            stuSex = #{stuSex},
        </if>
    </set>
    where stuId = #{stuId}
</update>


三、trim标签


标签:表示整理,更加灵活自定义,达到set、where或者其他效果。


1、前缀属性


prefix :内容整体添加前缀;没内容则不添加。

prefixOverrides:表示除去prefix后面第一个多余的关键字。


2、后缀属性


suffix :内容整体添加后缀;没内容则不添加。

suffixOverrides:表示除去suffix前面,也就是最后一个的多余关键字。


3、多个关键字使用 and|or 表示,“|”后面不能添加空格,否则不能识别。

<select id="findStuByBlurry" resultType="Student">
    select * from student 
    <trim prefix="where" prefixOverrides="and|or" suffix="order by stuId desc" suffixOverrides="and|or">
        <if test="stuName != null and stuName != ''">
            or stuName like concat('%',#{stuName},'%')
        </if>
        <if test="stuAge != null and stuAge != ''">
            and stuAge = #{stuAge}
        </if>
        <if test="stuSex != null and stuSex != ''">
            and stuSex = #{stuSex}
        </if>
    </trim>
</select>


四、choose_when_otherwise标签


<!-- 相当于Java的 switch...case,哪个条件成立执行哪个,条件不成立执行oherwise-->
<select id="findStuByBlurry2" resultType="Student">
    select * from student where
    <choose>
        <when test="stuName != null and stuName != ''">
            stuName = #{stuName}
        </when>
        <when test="stuId != null and stuId != ''">
            stuId = #{stuId}
        </when>
        <otherwise>
            stuSex = #{stuSex}
        </otherwise>
    </choose>
</select>


五、foreach标签


foreach标签:


  • collection属性默认值:


1.如果是数组,默认 collection = "array"


2.如果是集合,默认 collection = "list"


  • 自定义collection属性值:在参数前添加 @Param(“name”) 注解,则 collection = "name"


  • 遍历 map 对象


1.遍历map对象,添加注解,添加参数类型=map。

collection = “注解值”


2.遍历Map对象中的对象,比如Map中的List。

collection = “map的key名称”

<select id="findManyById" resultType="Student">
    select * from student where id in
    <foreach collection="params" open="(" close=")" separator="," item="item">
        #{item}
    </foreach>
</select>



foreach属性:


collection = 需要遍历的参数

index = 遍历的下标位置

open = 添加整体标签内容的前缀

close = 添加整体标签内容的后缀

separator = 内容之间的分隔符

item = 别名,取值通过,#{item值}


目录
相关文章
|
22天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
38 10
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
52 1
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
4月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
4月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
119 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
58 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块