Mybatis 9种动态 sql 标签使用

MyBatis提供了9种动态SQL标签:trim、where、set、foreach、if、choose、when、otherwise、bind;

1.if 标签

XML 复制代码
<select id="getUser">
    select * from User
    <where>
        <if test=" age != null ">
            and age > #{age}
        </if>
        <if test=" name != null ">
            and name like concat(#{name},'%')
        </if>
    </where>
</select>

2.choose 标签、when 标签、otherwise 标签

XML 复制代码
<select id="getUser">
    select * from User
    <where>
        <choose>
            <when test=" age != null ">
                and age > #{age}
            </when>
            <when test=" name != null ">
                and name like concat(#{name},'%')
            </when>
            <otherwise>
                and sex = '女'
            </otherwise>
        </choose>
    </where>
</select>

3.foreach 标签

XML 复制代码
<select id="findAll">
    select  * from user where ids in
    <foreach collection="list"
             item="item" index="index"
             open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

最终拼接完整的语句就变成:
select  * from user where ids in (1,2,3,...,100);

当然你也可以这样编写:
<select id="findAll">
    select  * from user where
    <foreach collection="list"
             item="item" index="index"
             open=" " separator=" or " close=" ">
        id = #{item}
    </foreach>
</select>

最终拼接完整的语句就变成:
select  * from user where id =1 or id =2 or id =3  ... or id = 100;

4.where 标签、set 标签

XML 复制代码
<select id="getUser">
    select * from User
    <where>
        <if test=" age != null ">
            and age > #{age}
        </if>
        <if test=" name != null ">
            and name like concat(#{name},'%')
        </if>
    </where>
</select>
XML 复制代码
<update id="updateUser">
    update user
    <set>
        <if test="age !=null">
            age = #{age},
        </if>
        <if test="username !=null">
            username = #{username},
        </if>
        <if test="password !=null">
            password = #{password},
        </if>
    </set>
    where id =#{id}
</update>

注意,set 标签之所以能够支持去除前缀逗号或者后缀逗号,
是由于其在构造 trim 标签的时候进行了前缀后缀的去除设置,而 where 标签在构造 trim 标签的时候就仅仅设置了前缀去除。

5.trim 标签

XML 复制代码
<trim prefix="SET" prefixOverrides="," >
    ...
</trim>

或者

<trim prefix="SET" suffixesToOverride="," >
    ...
</trim>

由于 where 标签和 set 标签这两种 trim 标签变种方案已经足以满足我们实际开发需求,所以直接使用 trim 标签的场景实际上不太很多(其实是我自己使用的不多,基本没用过)。

6.bind 标签

XML 复制代码
平时你使用 mysql 都是如何拼接模糊查询 like 语句的 ( oracle 不支持)
select * from user where name like concat('%',#{name},'%')


<select id="selecUser">
    <bind name="myName" value="'%' + _parameter.getName() + '%'" />
    SELECT * FROM user
    WHERE name LIKE #{myName}
</select>

无论使用哪种数据库,这个模糊查询的 Like 语法都是支持的

拓展:sql标签 + include 标签

XML 复制代码
<!-- 可复用的字段语句块 -->
<sql id="userColumns">
    id,username,password
</sql>
查询或插入时简单复用:

<!-- 查询时简单复用 -->
<select id="selectUsers" resultType="map">
    select
    <include refid="userColumns"></include>
    from user
</select>
相关推荐
键来大师3 小时前
Android15 RK3588 修改默认不锁屏不休眠
android·java·framework·rk3588
合作小小程序员小小店4 小时前
web网页开发,在线%考试管理%系统,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql
java·前端·系统架构·vue·intellij-idea·springboot
小坏讲微服务4 小时前
Spring Boot整合Redis注解,实战Redis注解使用
spring boot·redis·分布式·后端·spring cloud·微服务·mybatis
多多*5 小时前
maven常用的命令
java·log4j·maven
xie_pin_an5 小时前
MyBatis-Plus 实战:MPJLambdaWrapper 多表联查用法全解析
java·spring boot·spring·mybatis
ᐇ9595 小时前
Java LinkedList集合全面解析:双向链表的艺术与实战
java·开发语言·链表
luyun0202025 小时前
Windows 11操作更丝滑,绝了
java·运维·figma
码银5 小时前
【数据结构】顺序表
java·开发语言·数据结构
Boop_wu5 小时前
[Java EE] 计算机基础
java·服务器·前端
橘子海全栈攻城狮5 小时前
【源码+文档+调试讲解】基于Spring Boot的考务管理系统设计与实现 085
java·spring boot·后端·spring