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>
相关推荐
七星静香10 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员11 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU11 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie615 分钟前
在IDEA中使用Git
java·git
Elaine20239130 分钟前
06 网络编程基础
java·网络
G丶AEOM31 分钟前
分布式——BASE理论
java·分布式·八股
落落鱼201332 分钟前
tp接口 入口文件 500 错误原因
java·开发语言
想要打 Acm 的小周同学呀33 分钟前
LRU缓存算法
java·算法·缓存
镰刀出海36 分钟前
Recyclerview缓存原理
java·开发语言·缓存·recyclerview·android面试
阿伟*rui3 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel