MyBatis 之动态 SQL

文章目录

    • `` 标签
    • `` 标签
    • `` 标签
    • `` 标签
    • `&&` 标签
    • `` 标签
    • `/` 标签

动态 SQL 是 MyBatis 中非常重要和强大的功能之一,它允许根据不同的条件动态生成 SQL 语句,从而实现灵活的数据库操作。通过组合和嵌套使用这些动态 SQL 标签,可以根据不同的条件动态生成 SQL 语句,以满足各种复杂的数据库操作需求。

标签

标签通常用于在动态 SQL 中根据条件来动态拼接 SQL 语句。这个标签可以根据传入的参数值判断条件是否成立,从而决定是否包含特定的 SQL 片段。

test 属性是必需的,它包含一个 OGNL(Object Graph Navigation Language)表达式,MyBatis 会对这个表达式进行求值。如果表达式的值为true,就会将 标签内的 SQL 片段拼接到最终的 SQL 语句中;若为 false,则会忽略该 SQL 片段。

使用示例:

<select id="selectUsers" resultType="com.example.User">
    SELECT * FROM users
    WHERE 1 = 1
    <if test="name != null and name != ''">
        AND name = #{name}
    if>
    <if test="age != null">
        AND age = #{age}
    if>
select>

标签

标签通常与其他条件判断标签(如 )结合使用,用于动态拼接查询条件。

标签的主要作用是简化动态 SQL 中 WHERE 子句的编写,它能智能地处理 WHERE 子句中 ANDOR 关键字的拼接问题,也能自动将内部的条件片段用 ANDOR 连接。当 标签内的条件都不满足时,它会自动去掉 WHERE 关键字;当条件满足时,它会自动去掉第一个条件前多余的 ANDOR 关键字,避免出现 SQL 语法错误。

使用示例:

<select id="selectUsers" resultType="com.example.entity.User">
    SELECT * FROM users
    <where>
        <if test="name != null and name != ''">
            name = #{name}
        if>
        <if test="age != null">
            AND age = #{age}
        if>
    where>
select>

标签

标签可以在生成 SQL 语句时对文本进行修剪(trim)、添加前缀(prefix)、后缀(suffix)以及指定连接符。这使得在拼接 SQL 语句时可以更加灵活地控制生成的文本,往往与其他条件判断标签(如 等)结合使用。

标签属性 说明
prefix 标签内的 SQL 片段前添加指定的前缀
suffix 标签内的 SQL 片段后添加指定的后缀
prefixOverrides 去除 标签内 SQL 片段开头匹配的字符序列(默认为空)
suffixOverrides 去除 标签内 SQL 片段结尾匹配的字符序列(默认为空)

使用示例:

<insert id="insertUser" parameterType="com.example.entity.User">
    INSERT INTO users
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="name != null and name != ''">
            name,
        if>
        <if test="age != null">
            age,
        if>
    trim>
    VALUES
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="name != null and name != ''">
            #{name},
        if>
        <if test="age != null">
            #{age},
        if>
    trim>
insert>

标签

标签通常用于动态拼接更新语句的 SET 子句,它的核心功能是自动处理 SET 子句中的逗号。当 标签内部包含多个更新字段时,它会自动去掉最后一个字段后面多余的逗号,以此保证生成的 SQL 语句语法正确。 标签通常与其他条件判断标签(如 )结合使用。

使用示例:

<update id="updateByPrimaryKeySelective" parameterType="com.hstypay.bim.service.entity.GroupbyOrderDO">
    update t_groupby_order
    <set>
        <if test="groupbyOrderId != null">
            Fgroupby_order_id = #{groupbyOrderId,jdbcType=VARCHAR},
        if>
    set>
    <where>
        <if test="groupbyOrderId != null">
            and Fgroupby_order_id = #{groupbyOrderId,jdbcType=VARCHAR}
        if>
    where>
update>

&& 标签

标签类似于 Java 中的 switch-case 语句,可用于根据不同的条件选择执行不同的 SQL 片段。 标签通常与 标签一起使用。

MyBatis 会按顺序检查每个 标签的 test 属性中的条件表达式,一旦找到一个条件表达式为 true 标签,就会执行该 标签内的 SQL 片段,并且不再检查后续的 标签。如果所有 标签的条件都不满足,则会执行 标签内的 SQL 片段。

使用示例:

<select id="selectUser" resultType="com.example.entity.User">
    SELECT * FROM users
    <where>
        <choose>
            <when test="id != null">
                id = #{id}
            when>
            <when test="name != null and name != ''">
                name = #{name}
            when>
            <otherwise>
                age > 18
            otherwise>
        choose>
    where>
select>

标签

标签用于循环遍历集合或数组,从而实现批量操作,如批量插入、批量删除、批量更新以及根据多个条件进行查询等。

标签中,常用的属性包括:

参数 描述
collection 指定要迭代的集合属性名。在方法参数是集合时,其值就是参数名;若参数是 JavaBean,它则是 JavaBean 中集合属性的名称。(可以通过 @Param 指定名称)
item 为集合中的每个元素设置的别名,在标签内部可通过这个别名引用元素。
open 迭代内容的起始符号,例如在 SQL 的 IN 子句中,通常为 (
close 迭代内容的结束符号,如在 SQL 的 IN 子句中,一般是 )
separator 每次迭代之间的分隔符,像在 SQL 的 IN 子句中,通常是 ,

使用示例:


<select id="selectProductsByIds" resultType="com.example.entity.Product">
    SELECT * FROM products WHERE id IN
    <foreach collection="array" item="id" open="(" close=")" separator=",">
        #{id}
    foreach>
select>


<insert id="batchInsertProducts">
    INSERT INTO products (name) VALUES
    <foreach collection="list" item="product" separator=",">
        (#{product.name})
    foreach>
insert>

/ 标签

标签用于复用 SQL 片段,通常配合 标签一起使用,以简化 SQL 的编写并提高代码的可维护性。 标签必须定义在 SQL 语句所在的命名空间中,并且可以在命名空间内的其他 SQL 语句中通过 标签引用。 标签的 refid 属性指定了要引用的 SQL 片段的 id。

使用示例:

<sql id="userFields">
    user_name, user_email, user_age
sql>

<select id="getUserList" parameterType="map" resultType="User">
    SELECT <include refid="userFields" /> FROM user
select>

你可能感兴趣的:(Mybatis,mybatis,sql,数据库,mysql,oracle)