【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值}


目录
相关文章
|
3月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
278 18
|
8月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
7月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1017 0
|
3月前
|
SQL Java 数据库连接
SSM相关问题-1--#{}和${}有什么区别吗?--Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?--Spring支持的几种bean的作用域 Scope
在MyBatis中,`#{}`是预处理占位符,可防止SQL注入,适用于大多数参数传递场景;而`${}`是直接字符串替换,不安全,仅用于动态表名、列名等特殊场景。二者在安全性、性能及使用场景上有显著区别。
81 0
|
6月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
573 5
|
8月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
8月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
8月前
|
SQL XML Java
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
246 0
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
524 13