Mybatis 动态Sql标签使用总结

一、前言

常用的动态sql标签包括 if、choose(when、otherwise)、trim(where、set)、foreach。

二、标签介绍

2.1、if 标签

1、动态拼接查询条件

select DISTINCT ksid as id,ksdm as cd , ksmc as na ,id_org ,1 as fg_active,kspydm as py FROM
        V_CIS_RO_USER
        WHERE 1=1
        <if test="orgId != null">
            AND id_org = #{orgId}
        </if>
        <if test="userId != null">
            AND YHID = #{userId}
        </if>
        <if test="id != null">
            AND ksid = #{id}
        </if>
        <if test="search != null and  search != '' ">
            and  kspydm LIKE concat('%', concat(#{search}, '%'))
        </if>
        ORDER BY kspydm

2、动态选择不同的执行sql

根据输入参数unitType的不同情况来join不同的表查询结果集。

<select id="getAdjRatios" resultType="com.fp.epower.model.dto.PowerPredictAdjDto">
        <if test="unitType == null">
            SELECT a.*,b.date,b.status FROM power_forecast_adjust_data a
            LEFT JOIN power_forecast_adjust_info b
            ON a.info_id = b.id
        </if>
        <if test="unitType != null and unitType == 1">
            SELECT a.*,b.date,b.status,c.dispatch_name unitName FROM power_forecast_adjust_data a
            LEFT JOIN power_forecast_adjust_info b
            ON a.info_id = b.id
            LEFT JOIN gen_set c
            ON a.unit_id = c.id
        </if>
        <if test="unitType != null and unitType == 2">
            SELECT a.*,b.date,b.status,c.abbreviation unitName FROM power_forecast_adjust_data a
            LEFT JOIN power_forecast_adjust_info b
            ON a.info_id = b.id
            LEFT JOIN dic_power_plant_info c
            ON a.unit_id = c.id
        </if>
        <where>
            <if test="status != null">
                b.status = #{status}
            </if>
            <if test="unitType != null and unitType != 0">
                AND a.unit_type = #{unitType}
            </if>
            <if test="date != null">
                AND b.date = #{date}
            </if>
        </where>
    </select>

2.2、choose(when、otherwise) 标签

如果拼接的查询条件存在多个分支,可以使用 choose(类似于switch关键字)

<select id="getAdjRatio" resultType="java.lang.String">
        SELECT ratio FROM power_forecast_adjust_data a
        LEFT JOIN power_forecast_adjust_info b
        ON a.info_id = b.id
        <choose>
            <when test="status != null and status != 0">
                b.`status` = #{status}
            </when>
            <when test="unitType != null and unitType != 0">
                AND a.unit_type = #{unitType}
            </when>
            <when test="unitId != null and unitId != ''">
                AND a.unit_id = #{unitId}
            </when>
            <when test="date != null">
                AND b.date = #{date}
            </when>
            <otherwise>
                b.`status` = 1
            </otherwise>
        </choose>
    </select>

2.3、trim(where、set) 标签

使用 trim 可以定义如何覆盖前缀或者后缀,可以定义where节点、set节点等在有多余字符存在的情况下的前后缀覆盖策略。

<select id="selectUsers" resultType="com.example.User">
  SELECT *
  FROM user
  <trim prefix="WHERE" prefixOverrides="AND | OR ">
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
    <if test="gender != null">
      AND gender = #{gender}
    </if>
  </trim>
</select>

说明:

在语句的FROM子句后面使用了标签来处理WHERE子句中的条件。下面是对标签的几个常用属性的解释:

1、prefix:指定在元素内容之前添加的字符串,这里是"WHERE",即在WHERE子句之前添加"WHERE"关键字。

2、prefixOverrides:指定需要从元素内容中移除的字符串,多个字符串使用"|"隔开,这里移除了以"AND"或"OR"开头的内容。

在 trim 标签中,根据条件判断使用 if 标签来动态生成SQL语句的WHERE子句。if 标签的test属性用于判断条件是否成立,如果条件成立,则会将 if 标签中的内容添加到生成的SQL语句中。

最终生成的SQL语句将会根据传入的参数动态生成,只在满足条件的情况下添加WHERE子句的条件,如下所示:

SELECT * FROM user WHERE name = #{name} AND age = #{age}

注意,由于使用了 trim 标签,只有在满足条件的情况下才会添加WHERE关键字和相应的条件。

2.4、foreach 标签

1、foreach元素的属性

item: 集合元素迭代时的别名称,该参数为必选项,如果遍历的对象是map,则item为val;

index: 在list、array中,index为元素的序号索引。但是在Map中,index为遍历元素的key值,该参数为可选项;

open: 遍历集合时的开始符号,通常与close=")"搭配使用。使用场景IN(),values()时,该参数为可选项;

separator: 元素之间的分隔符,类比在IN()的时候,separator=“,”,最终所有遍历的元素将会以设定的(,)逗号符号隔开,该参数为可选项;

close: 遍历集合时的结束符号,通常与open="("搭配使用,该参数为可选项;

2、collection属性值的三种情况

2.1、如果传入的参数类型为list时: collection的默认属性值为list,同样可以使用@Param注解自定义name;

2.2、如果传入的参数类型为array时: collection的默认属性值为array,同样可以使用@Param注解自定义name;

2.3、如果传入的参数类型为Map时: collection的属性值可为三种情况:1.遍历map.keys;2.遍历map.values;3.遍历map.entrySet();

3、代码示例

<select id="getAdjRatio" resultType="java.lang.String">
        SELECT ratio FROM power_forecast_adjust_data a
        LEFT JOIN power_forecast_adjust_info b
        ON a.info_id = b.id
        <where>
            id IN 
            <foreach collection="ids" item="id" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </where>
</select>
  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MyBatis 是一种优秀的 ORM 框架,它的优势之一就是可以执行动态 SQL。动态 SQL 允许你在运行时创建 SQL 语句,根据不同的情况动态地拼接 SQL 语句,这使得 SQL 语句的编写更加灵活。 在 MyBatis 中,动态 SQL 的执行原理如下: 1. MyBatis 会解析 Mapper 文件中的 SQL 语句,根据其中的动态 SQL 片段,生成相应的 SQL 语句。 2. 在执行 SQL 语句之前,MyBatis 会将 SQL 语句中的占位符替换为具体的参数值。 3. MyBatis使用 JDBC 执行生成的 SQL 语句,执行查询或者更新操作。 MyBatis 提供了以下几种动态 SQL 语句: 1. if 元素:用于根据条件判断是否包含某一部分 SQL 语句。 2. choose 元素:类似于 Java 中的 switch 语句,用于从多个选项中选择一个。 3. when 元素:用于在 choose 元素中定义选项。 4. otherwise 元素:用于在 choose 元素中定义默认选项。 5. trim 元素:用于从 SQL 语句的开头或结尾去除指定的字符串。 6. where 元素:用于在 SQL 语句中添加 WHERE 子句。 7. set 元素:用于在 SQL 语句中添加 SET 子句。 8. foreach 元素:用于对集合进行遍历,并生成对应的 SQL 语句。 以上这些元素可以组合使用,从而生成更加复杂的 SQL 语句。使用动态 SQL,可以大大提高 MyBatis 的灵活性和可扩展性。 ### 回答2: MyBatis动态SQL的执行原理如下: MyBatis是一款基于Java的持久层框架,它的动态SQL功能是通过使用XML或注解来定义SQL语句,以及使用动态标签和OGNL表达式来实现动态SQL的执行。 首先,MyBatis会解析XML配置文件或注解中定义的SQL语句,并将其转化为内部存储结构,通常是一棵解析树。这个过程通常在应用程序启动时完成,以提高后续SQL的执行效率。 在执行SQL语句时,MyBatis会先根据动态标签的判断条件来确定是否需要执行该SQL语句。动态标签例如`&lt;if>`、`&lt;choose>`、`&lt;when>`、`&lt;otherwise>`等,通过判断条件来决定是否包含或执行对应的SQL片段。 在动态标签中,我们可以使用OGNL(对象图导航语言)表达式来实现更灵活的判断逻辑。OGNL可以访问和操作对象的属性、方法等,并支持一些基本的判断和计算操作,如判断集合是否为空、字符串是否相等等。 执行动态SQL时,MyBatis还会将动态SQL中的动态标签和OGNL表达式进行解析和执行,根据判断结果来拼接最终的SQL语句。这个过程通常发生在SQL语句被执行之前。 最后,MyBatis使用JDBC连接数据库,并将最终生成的SQL语句发送到数据库服务器执行。数据库服务器返回执行结果后,MyBatis会将结果转换为Java对象,并返回给应用程序进行后续处理。 总结来说,MyBatis动态SQL的执行原理是通过解析和执行动态标签和OGNL表达式来生成最终的SQL语句,并将其发送到数据库服务器执行。这种动态化的特点使得开发者能够根据不同的条件和场景生成不同的SQL语句,从而提高应用程序的灵活性和性能。 ### 回答3: MyBatis动态SQL的执行原理如下: 1. 解析mapper文件:MyBatis通过解析mapper文件,将其中的SQL语句解析为对应的对象模型。 2. 处理动态标签MyBatis中的动态SQL采用了一些特殊的标签,如if、choose、when、otherwise等,用于根据不同的条件生成不同的SQL语句。在执行前,MyBatis会根据传入的参数动态处理这些标签,生成最终的SQL语句。 3. 参数绑定:MyBatis会将传入的参数与SQL语句中的占位符进行绑定。根据参数的类型,MyBatis会调用对应的类型处理器将参数转换成SQL语句中的具体数值。 4. 执行SQL语句:MyBatis会将生成的SQL语句交给对应的数据库驱动程序执行。数据库驱动程序会将SQL语句发送到数据库服务器,数据库服务器解析执行SQL语句,并返回执行结果。 5. 结果映射:MyBatis会根据mapper文件中的配置,将数据库返回的结果映射为Java对象。MyBatis提供了丰富的结果映射方式,包括基本类型、POJO对象、集合等。 总的来说,MyBatis动态SQL的执行原理可以归纳为解析mapper文件、处理动态标签、参数绑定、执行SQL语句和结果映射。通过这一步骤,MyBatis实现了动态生成SQL语句、参数绑定和结果映射的功能,为开发者提供了方便灵活的SQL操作方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值