目录
动态SQL是一种在运行时动态生成和执行SQL查询语句的技术。它允许根据不同条件、变量或情景来构建SQL查询,以达到SQL复用、简化编程的效果。。也就是根据具体的参数条件,来对SQL语句进行动态拼接。
在 MyBatis 中,
<if>
标签是用于动态生成 SQL 查询条件的元素之一。它允许根据条件来包含或排除 SQL 片段。这个标签通常嵌套在其他 MyBatis SQL 标签内部(例如<select>
,<update>
,<delete>
,<insert>
等),用于根据特定条件动态添加 SQL 查询语句。
<!-- 示例 -->
<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
-->
在 MyBatis 中,并没有直接的
<where>
标签。然而,可以使用<where>
元素作为一个 SQL 片段的容器,以便在动态生成 SQL 语句时更灵活地处理 WHERE 子句的条件。使用
<where>
元素,可以避免在动态 SQL 构建过程中处理多余的AND
或OR
关键字,因为它会自动处理条件之间的逻辑连接。
<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>
在 MyBatis 中,
<set>
标签通常用于动态生成 UPDATE 语句中的 SET 子句。它类似于<where>
标签,用于在动态 SQL 构建过程中处理 SET 子句中的字段更新。set标签将if标签代码块包起来,并去掉最后一个“,”
<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>
<trim>
标签是 MyBatis 中用于处理动态 SQL 的标签之一,它可以帮助在 SQL 语句中处理不同部分的前缀、后缀或者其他文本,通常用于处理逗号、AND、OR等连接词。
<trim>
标签可以用于去除不必要的文本,并自动处理文本之间的逻辑连接,比如在动态生成的 SQL 中去除多余的逗号或者添加合适的连接词。
<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>
<foreach>
标签是 MyBatis 中用于在 SQL 查询中进行遍历操作的标签,通常用于构建 IN 子句或者批量插入/更新等操作。它允许你遍历集合并将集合中的元素应用到 SQL 查询语句中的特定部分。
<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>
<sql>
标签是 MyBatis 中用于定义可重用 SQL 片段的标签。它允许你在一个地方定义一个 SQL 片段,并在需要的地方引用它,以避免重复编写相同的 SQL 代码。
<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>
bind
标签
<bind>
标签是 MyBatis 中用于将表达式结果赋给变量的标签。它可以在 SQL 语句中创建变量并将其赋值,这些变量可以在查询中被重复使用,提高了 SQL 查询语句的灵活性和可读性。
<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>
<choose>
标签在 MyBatis 中用于构建条件选择语句,类似于 Java 中的 switch 语句。它允许在多个条件中选择一个满足条件的分支,并执行该分支下的 SQL 查询。通常情况下,
<choose>
标签与<when>
和<otherwise>
标签一起使用。<when>
标签用于定义条件分支,而<otherwise>
标签用于定义默认分支(类似于 switch 语句中的 default)。
<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>
<include>
标签在 MyBatis 中用于包含外部定义的 SQL 片段或动态 SQL 片段。它能够在 SQL 查询中引用已定义的 SQL 片段,实现 SQL 代码的重用和模块化。
假设有一个 SQL 片段定义如下:
<sql id="userColumns">
id, username, email
</sql>
你可以在查询语句中使用 <include>
标签引用这个 SQL 片段:
<select id="getUsers" parameterType="map" resultType="User">
SELECT
<include refid="userColumns"/>
FROM users
</select>