MyBatis的动态SQL

目录

一、什么是动态SQL?

二、MyBatis标签

1、if标签

2、where标签

3、set标签

4、trim标签

5、foreach标签

6、sql标签

7、bind标签

8、choose标签

9、include标签


一、什么是动态SQL?

动态SQL是一种在运行时动态生成和执行SQL查询语句的技术。它允许根据不同条件、变量或情景来构建SQL查询,以达到SQL复用、简化编程的效果。。也就是根据具体的参数条件,来对SQL语句进行动态拼接。

二、MyBatis标签

1、if标签

在 MyBatis 中,<if> 标签是用于动态生成 SQL 查询条件的元素之一。它允许根据条件来包含或排除 SQL 片段。这个标签通常嵌套在其他 MyBatis SQL 标签内部(例如 <select>, <update>, <delete>, <insert> 等),用于根据特定条件动态添加 SQL 查询语句。

XML 复制代码
<!-- 示例 -->

 <select id="findByUser" resultType="User">
        select * from user where 1=1
        <if test="username!=null and username != ''">
            and username=#{username}
        </if>
        <if test="birthday!=null">
            and birthday=#{birthday}
        </if>
        <if test="sex!=null and sex != ''">
            and sex=#{sex}
        </if>
        <if test="address!=null and address != ''">
            and address=#{address}
        </if>
    </select>


<!--
当满足某个test条件时,才会将那个<if>标签内的SQL语句拼接上去。
都不满足时,查询语句为  select * from user 
-->
2、where标签

在 MyBatis 中,并没有直接的 <where> 标签。然而,可以使用 <where> 元素作为一个 SQL 片段的容器,以便在动态生成 SQL 语句时更灵活地处理 WHERE 子句的条件。

使用 <where> 元素,可以避免在动态 SQL 构建过程中处理多余的 AND 或 OR 关键字,因为它会自动处理条件之间的逻辑连接。

XML 复制代码
  <select id="selectUser" parameterType="com.by.pojo.User" resultType="com.by.pojo.User">
        SELECT * FROM user
        <!--where标签一定要包括if标签,作用:去掉第一个and-->
        <where>
            <if test="id != null">
                AND id=#{id}
            </if>
            <if test="username!=null and username!=''">
                AND username=#{username}
            </if>
            <if test="birthday!=null">
                and birthday=#{birthday}
            </if>
            <if test="sex!=null and sex != ''">
                and sex=#{sex}
            </if>
            <if test="address!=null and address != ''">
                and address=#{address}
            </if>
        </where>
3、set标签

在 MyBatis 中,<set> 标签通常用于动态生成 UPDATE 语句中的 SET 子句。它类似于 <where> 标签,用于在动态 SQL 构建过程中处理 SET 子句中的字段更新。

set标签将if标签代码块包起来,并去掉最后一个","

XML 复制代码
<update id="updateUserById" parameterType="com.by.pojo.User">
        UPDATE user
        <!--set标签一定要包括if标签,作用:去掉最后一个","-->
        <set>
            <if test="username!=null and username!=''">
                username=#{username},
            </if>
            <if test="birthday!=null">
                birthday=#{birthday},
            </if>
            <if test="sex!=null and sex != ''">
                  sex=#{sex},
            </if>
            <if test="address!=null and address != ''">
                address=#{address},
            </if>
        </set>
        WHERE id=#{id}
    </update>
4、trim标签

<trim> 标签是 MyBatis 中用于处理动态 SQL 的标签之一,它可以帮助在 SQL 语句中处理不同部分的前缀、后缀或者其他文本,通常用于处理逗号、AND、OR等连接词。

<trim> 标签可以用于去除不必要的文本,并自动处理文本之间的逻辑连接,比如在动态生成的 SQL 中去除多余的逗号或者添加合适的连接词。

XML 复制代码
 <insert id="addUser" parameterType="com.by.pojo.User">
        INSERT INTO user
        <!--
            set标签一定要包括if标签,作用:
                prefix:加上前缀,"("
                suffix:加上后缀,")"
                prefixOverrides:去除多余的前缀内容
                suffixOverrides:去除多余的后缀内容,","
        -->
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username!=null and username!=''">
                username,
            </if>
            <if test="birthday!=null">
                birthday,
            </if>
            <if test="sex!=null and username != '' ">
                sex,
            </if>
            <if test="address!=null and username != '' ">
                address,
            </if>
        </trim>
5、foreach标签

<foreach> 标签是 MyBatis 中用于在 SQL 查询中进行遍历操作的标签,通常用于构建 IN 子句或者批量插入/更新等操作。

它允许你遍历集合并将集合中的元素应用到 SQL 查询语句中的特定部分。

XML 复制代码
 <delete id="deleteUserByIds" parameterType="list">
        DELETE FROM user WHERE id in
        <!--
            collection:取值list、array、@Param("keyName")
            item="id":循环每次取出的具体对象
            open="(" :加上前缀
            close=")" :加上后缀
            separator=",":分隔符
        -->
        <foreach collection="idArr" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>
6、sql标签

<sql> 标签是 MyBatis 中用于定义可重用 SQL 片段的标签。它允许你在一个地方定义一个 SQL 片段,并在需要的地方引用它,以避免重复编写相同的 SQL 代码。

XML 复制代码
 <select id="getUser" parameterType="com.by.pojo.User" resultType="com.by.pojo.User">
        SELECT * FROM user
        <where>
            <!--refid="get_user_where":sql标签的id-->
            <include refid="get_user_where"></include>
        </where>
    </select>
7、bind标签

<bind> 标签是 MyBatis 中用于将表达式结果赋给变量的标签。它可以在 SQL 语句中创建变量并将其赋值,这些变量可以在查询中被重复使用,提高了 SQL 查询语句的灵活性和可读性。

XML 复制代码
<select id="getUserByAgeRange" parameterType="map" resultType="User">
  <bind name="minAge" value="'18'" />
  <bind name="maxAge" value="'40'" />

  SELECT * FROM users
  WHERE age BETWEEN #{minAge} AND #{maxAge}
</select>
8、choose标签

<choose> 标签在 MyBatis 中用于构建条件选择语句,类似于 Java 中的 switch 语句。它允许在多个条件中选择一个满足条件的分支,并执行该分支下的 SQL 查询。

通常情况下,<choose> 标签与 <when><otherwise> 标签一起使用。<when> 标签用于定义条件分支,而 <otherwise> 标签用于定义默认分支(类似于 switch 语句中的 default)。

XML 复制代码
<select id="getUserStatus" parameterType="map" resultType="User">
  <choose>
    <when test="status == 'active'">
      SELECT * FROM users WHERE status = 'active'
    </when>
    <when test="status == 'inactive'">
      SELECT * FROM users WHERE status = 'inactive'
    </when>
    <otherwise>
      SELECT * FROM users
    </otherwise>
  </choose>
</select>
9、include标签

<include> 标签在 MyBatis 中用于包含外部定义的 SQL 片段或动态 SQL 片段。它能够在 SQL 查询中引用已定义的 SQL 片段,实现 SQL 代码的重用和模块化。

假设有一个 SQL 片段定义如下:

XML 复制代码
<sql id="userColumns">
  id, username, email
</sql>

你可以在查询语句中使用 <include> 标签引用这个 SQL 片段:

XML 复制代码
<select id="getUsers" parameterType="map" resultType="User">
  SELECT
  <include refid="userColumns"/>
  FROM users
</select>
相关推荐
Anastasiozzzz17 分钟前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人19 分钟前
通过脚本推送Docker镜像
java·docker·容器
铁蛋AI编程实战36 分钟前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘1 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays10111 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
摇滚侠1 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.1 小时前
java多态
java·开发语言·c++
李堇1 小时前
android滚动列表VerticalRollingTextView
android·java
泉-java1 小时前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
麦聪聊数据2 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构