mybatis动态SQL常用的标签使用及说明

 更新时间:2026年04月27日 15:48:33   作者:m0_59259076  
文章主要讲解了MyBatis中的动态SQL标签,包括使用场景、作用和示例,主要介绍了<where>、<choose>、&<set>、&<foreach>、&&<bind>等等、标签的的用用使用方法和作用,以及<sql>片段的概念和引用方式

1. <sql>标签

也叫<sql>片段,在使用sql片段时使用include标签通过sql片段的id进行引用,sql片段的id在当前空间是唯一的,sql片段中也可以写其他的内容,只要符合语法规范都是可以的。

示例:

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, name, age, hobby, del_flag, create_time, update_time
    </sql>
    <select id="listAnimals" resultType="com.zhang.entity.Animal">
        select
        <include refid="Base_Column_List"></include>
        from animal
    </select>

(注:<include>可以是单标签的,效果是一样的,我这里使用了双标签~) 

2.<where>标签

根据where其后是否有sql,判断拼接 where,满足条件就拼接,否则不拼接。示例:

    <select id="getAnimalByName" resultType="com.zhang.entity.Animal">
        select * from animal
        <where>
            <if test="name!=null and name!=''">
                and name = #{name}
            </if>
        </where>
    </select>

3.<choose> 标签

类似于Java中的switch分支。只进入一个满足when的条件,如果所有when都不满足,则进入otherwise。

示例:

    <select id="getAnimalsByNameOrHobby" resultType="com.zhang.entity.Animal">
        select * from animal
        <choose>
            <when test="hobby!=null and hobby!='' and name!=null and name!=''">
                hobby = #{hobby} and name = #{name}
            </when>
            <when test="hobby!=null and hobby!=''">
                hobby = #{hobby}
            </when>
            <otherwise>
                name = #{name}
            </otherwise>
        </choose>
    </select>

4.<set>标签

与where有相似,其后如果存在条件,则拼接set。

<set>标签会动态地在行首插入SET关键字,并且自动帮我们去掉多余的逗号,适用于update,示例:

    <update id="update">
        update animal
        <set>
            <if test="age!=null and age!=''">
                age = #{age}
            </if>
            <if test="name!=null and name!=''">
                name = #{name},
            </if>
            <if test="hobby!=null and hobby!=''">
                hobby = #{hobby}
            </if>
        </set>
        where id = #{id}
    </update>
    <update id="updateById" parameterType="com.zhang.entity.Animal">
    update animal
    <set>
        <if test="name != null">
            `name` = #{name,jdbcType=VARCHAR},
        </if>
        <if test="age != null">
            `age` = #{age,jdbcType=VARCHAR},
        </if>
        <if test="hobby != null">
            hobby = #{hobby,jdbcType=VARCHAR},
        </if>
        <if test="create_time != null">
            create_time = #{create_time,jdbcType=TIMESTAMP},
        </if>
        <if test="update_time != null">
            update_time = #{update_time,jdbcType=TIMESTAMP},
        </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
    </update>

5.<foreach>标签

用于遍历List、Map、Array , 属性如下:

  • collection:指定需要遍历的元素
  • item:遍历之后的每一项
  • separator:定义foreach里面语句的分隔符
  • index:map中代表key,数组中代表数组下标
    <select id="listAnimals" resultType="com.zhang.entity.Animal">
        SELECT * FROM animal
        WHERE id in
        <foreach collection="ids" item="id" index="index"
                 open="(" close=")" separator=",">
            #{id}
        </foreach>
    </select>

6.<bind>标签,用来定义变量

示例:

  • mapper层:
List<Animal> getByName(@Param("animalName") String name);
  • xml映射层:
    <select id="getByName" resultType="com.zhang.entity.Animal">
        <!--animalName为传过来的参数-->
        <!--根据动物名字进行模糊查询-->
        <bind name="animalNameLike" value="'%'+ animalName +'%'"/>
        select * from animal
        <where>
            <if test="animalName != null and animalName != ''">
                and `name` like #{animalNameLike}
            </if>
        </where>
    </select>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java如何在沙箱环境中测试支付宝支付接口

    Java如何在沙箱环境中测试支付宝支付接口

    这篇文章主要介绍了Java如何在沙箱环境中测试支付宝支付接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 在SpringBoot项目中的使用Swagger的方法示例

    在SpringBoot项目中的使用Swagger的方法示例

    这篇文章主要介绍了在SpringBoot项目中的使用Swagger的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 深入分析Spring Cloud 负载均衡器架构选型

    深入分析Spring Cloud 负载均衡器架构选型

    文章详细介绍了OpenFeign的初始化和执行流程,包括FeignClient注解、FeignClientsRegistrar类、FeignClientFactoryBean工厂类、Targeter接口及其实现等,感兴趣的朋友一起看看吧
    2024-12-12
  • Java设计模式之单例和原型

    Java设计模式之单例和原型

    这篇文章介绍了Java设计模式之单例和原型,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 基于Redis分布式锁Redisson及SpringBoot集成Redisson

    基于Redis分布式锁Redisson及SpringBoot集成Redisson

    这篇文章主要介绍了基于Redis分布式锁Redisson及SpringBoot集成Redisson,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小小伙伴可以参考一下
    2022-09-09
  • 浅谈Maven安装及环境配置出错的解决办法

    浅谈Maven安装及环境配置出错的解决办法

    这篇文章主要介绍了浅谈Maven安装及环境配置出错的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java 并发编程基础概念与常见问题整理

    Java 并发编程基础概念与常见问题整理

    这篇文章主要介绍了Java 并发编程基础概念与常见问题整理,本文将带你走进Java并发编程的世界,系统梳理基础概念、剖析常见问题,并补充实用细节,为后续深入学习打下坚实基础,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • java线程池核心线程不被摧毁的原理及分析

    java线程池核心线程不被摧毁的原理及分析

    这篇文章主要介绍了java线程池核心线程不被摧毁的原理及分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Springboot居然可以设置动态的Banner(推荐)

    Springboot居然可以设置动态的Banner(推荐)

    这篇文章主要介绍了Springboot居然可以设置动态的Banner,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 在CentOS上配置Java环境变量的教程

    在CentOS上配置Java环境变量的教程

    这篇文章主要介绍了在CentOS上配置Java环境变量的教程,同时适用于Fedora等其他RedHat系的Linux系统,需要的朋友可以参考下
    2015-06-06

最新评论