Mybatis动态Sql标签使用小结

 更新时间:2024年04月26日 08:52:30   作者:何以解忧,唯有..  
本文主要介绍了Mybatis动态Sql标签使用,常用的动态sql标签包括 if、choose(when、otherwise)、trim(where、set)、foreach,下面就来介绍一下

一、前言

常用的动态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>

到此这篇关于Mybatis动态Sql标签使用小结的文章就介绍到这了,更多相关Mybatis动态Sql标签内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Maven仓库无用文件和文件夹清理的方法实现

    Maven仓库无用文件和文件夹清理的方法实现

    这篇文章主要介绍了Maven仓库无用文件和文件夹清理的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 在IntelliJ IDEA中创建和运行java/scala/spark程序的方法

    在IntelliJ IDEA中创建和运行java/scala/spark程序的方法

    这篇文章主要介绍了在IntelliJ IDEA中创建和运行java/scala/spark程序的教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Jenkins+Docker+Gitee+SpringBoot自动化部署

    Jenkins+Docker+Gitee+SpringBoot自动化部署

    本文主要介绍了Jenkins+Docker+Gitee+SpringBoot自动化部署,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


    2022-03-03
  • JAVA中Comparable接口和自定义比较器示例讲解

    JAVA中Comparable接口和自定义比较器示例讲解

    这篇文章主要给大家介绍了关于JAVA中Comparable接口和自定义比较器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • springboot为异步任务规划自定义线程池的实现

    springboot为异步任务规划自定义线程池的实现

    本文主要介绍了springboot为异步任务规划自定义线程池,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 背包问题-动态规划java实现的分析与代码

    背包问题-动态规划java实现的分析与代码

    这篇文章主要给大家介绍了关于背包问题动态规划java实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Springdoc替换swagger的实现步骤分解

    Springdoc替换swagger的实现步骤分解

    最近在spring看到的,spring要对api文档动手了,有些人说swagger不好用,其实也没那么不好用,有人说代码还是有点侵入性,这倒是真的,我刚试了springdoc可以说还是有侵入性但是也可以没有侵入性,这就看你对文档有什么要求了
    2023-02-02
  • Java中SSM+Shiro系统登录验证码的实现方法

    Java中SSM+Shiro系统登录验证码的实现方法

    这篇文章主要介绍了 SSM+Shiro系统登录验证码的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • springboot 整合fluent mybatis的过程,看这篇够了

    springboot 整合fluent mybatis的过程,看这篇够了

    这篇文章主要介绍了springboot 整合fluent mybatis的过程,配置数据库连接创建数据库的详细代码,本文给大家介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • Java 腾讯验证码平台使用实例

    Java 腾讯验证码平台使用实例

    这篇文章主要介绍了Java 腾讯验证码平台使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论