MyBatis-动态SQL

今天学习了动态SQL,回顾一下

动态SQL就是在SQL层面执行逻辑代码

1、 if

最常见情景是根据条件包含 where 子句的一部分;

test=" " 里的是判断条件;

where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除,这一特性让我们再也不用写where 1=1 了 QAQ。

<select id="getBlogByIF" parameterType="map" resultType="Blog">
        select * from blog
        <where>
            <if test="title != null">
                title = #{title}
            </if>
            <if test="author != null">
                and author = #{author}
            </if>
        </where>
    </select>

2、choose (when, otherwise)

choose就相当于我们以前用的switch语句,只选取第一个符合的条件执行;

如果第一个when条件成立,则后面的when就会失效;

ortherwise 就是备选方案,可以为空。

    <select id="getBlogByChoose" resultType="Blog">
        select * from blog
        <where>
            <choose>
                <when test="id != null">
                    id = #{id}
                </when>
                <when test="title != null">
                    and title = #{title}
                </when>

                <otherwise>

                </otherwise>
            </choose>
        </where>
    </select>

3、trim (where, set)

set 元素大多用于update语句,可以动态包含需要更新的列,忽略其它不更新的列;

set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的);

<update id="updateBlogBySet" parameterType="map">
        update blog
        <set>
            <if test="title != null">
                title = #{title},
            </if>
            <if test="author">
                author = #{author},
            </if>
        </set>
        where id = #{id}
    </update>

其实 set 元素和where元素都是通过trim元素来实现对应的功能的

我们也可以通过自定义 trim 元素来定制 where 元素的功能

与where 元素等价的自定义 trim 元素为:
//prefixOverrides 属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)
//会移除所有 prefixOverrides 属性中指定的内容,
//并且插入 prefix 属性中指定的内容
<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>
与 set 元素等价的自定义 trim 元素为:
<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

我觉得吧,新手会用where和set就够了(个人愚见),后面需要时再回来回顾trim吧 QAQ

4、foreach

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)
foreach提供给我们遍历集合的功能,提取集合中的元素插入到sql语句中

foreach一共有6个参数

clooection :需要遍历的集合
open :开头字符串
close :结尾字符串
separator : 分隔符
item : 集合中的元素
index : 当使用 Map 对象(或者 Map.Entry 对象的集合)时,item对应的键
<select id="getBlogByForeach" resultType="Blog">
        select * from blog
        <where>
            <foreach collection="ids" open="and (" close=")" separator="or" item="id">
                id = #{id}
            </foreach>
        </where>
    </select>

还有一个就是关于代码的复用

sql标签可以实现代码的复用

    <sql id="ifTest">
        <if test="title != null">
            title = #{title}
        </if>
        <if test="author != null">
            and author = #{author}
        </if>
    </sql>

在需要使用这段代码的地方加上incude即可引用

    <select id="getBlogByIF" parameterType="map" resultType="Blog">
        select * from blog
        <where>
            <include refid="ifTest"></include>
        </where>
    </select>
上一篇:【 LeetCode 】58、最后一个单词的长度


下一篇:浮点数计算常见错误1.#INF, 1.#IND和#QNAN