Mybatis常用动态SQL标签

<where> 标签

作用

智能处理 WHERE 子句,自动去除多余的 AND 或 OR

基本语法

java 复制代码
<where>
    SQL条件...
</where>

<if> 标签

作用

根据条件判断是否包含某段SQL

基本语法

java 复制代码
<if test="condition">
    SQL片段
</if>

<choose>, <when>, <otherwise> 标签

作用

类似 Java 的 switch-case 语句,从多个条件中选择一个

基本语法

java 复制代码
<choose>
    <when test="condition1">SQL1</when>
    <when test="condition2">SQL2</when>
    <otherwise>默认SQL</otherwise>
</choose>
java 复制代码
  <select id="selectConditionList" resultType="com.java.vo.GroupVO"
            parameterType="com.java.vo.filter.GroupFilterVO">
        SELECT count(b.sfp_user_id) people,a.id,a.group_name groupName, a.group_accord_name groupAccordName,a.app_id
        appId,a.create_by createBy,
        a.create_time createTime
        FROM user_group a LEFT JOIN group_user b on b.user_group_id = a.id
        <where>
            a.app_id = #{appId}
            <choose>
                <when test="onlyMine">
                    and a.create_by=#{userNm}
                    <choose>
                        <when test="keyword != null and keyword !=''">
                            and a.group_accord_name like CONCAT('%',#{keyword},'%')
                        </when>
                    </choose>
                </when>
                <otherwise>
                    <choose>
                        <when test="keyword != null and keyword !=''">
                            and (a.create_by like CONCAT('%',#{keyword},'%') or a.group_accord_name like
                            CONCAT('%',#{keyword},'%'))
                        </when>
                    </choose>
                </otherwise>
            </choose>
        </where>
        GROUP BY a.group_name , a.group_accord_name ,a.app_id , a.create_by ,a.create_time ,a.id
        ORDER BY
        <choose>
            <when test='peopleAscDesc == "0"'>
                people DESC,createTime DESC
            </when>
            <when test='peopleAscDesc == "1"'>
                people ASC,createTime DESC
            </when>
            <otherwise>
                createTime DESC
            </otherwise>
        </choose>
    </select>

<case> 标签

作用

mapper.xml文件中,需要直接给查询的数据直接赋值或者别名显示的时候需要用到CASE WHEN THEN

java 复制代码
select case 
  when total > max then 2 
  when total < min then 1 
else 0
end
from ta 

<set> 标签

作用

智能处理 UPDATE 语句中的 SET 子句,自动去除末尾逗号

java 复制代码
<!-- 动态更新用户信息 -->
<update id="updateUserSelective" parameterType="User">
    UPDATE users
    <set>
        <if test="name != null">
            name = #{name},
        </if>
        <if test="email != null">
            email = #{email},
        </if>
        <if test="phone != null">
            phone = #{phone}
        </if>
    </set>
    WHERE id = #{id}
</update>

<foreach> 标签

作用

遍历集合,通常用于 IN 条件或批量操作

属性说明

  • collection: 要遍历的集合
  • item: 每个元素的变量名
  • index: 索引变量名
  • open: 开始符号,只会拼接一次
  • close: 结束符号,只会拼接一次
  • separator: 分隔符。foreach 标签不会错误地添加多余的分隔符,也就是最后一次迭代不会加分隔符
java 复制代码
<!-- IN 查询 -->
<select id="selectUsersInIds" parameterType="list" resultType="User">
    SELECT * FROM users 
    WHERE id IN
    <foreach collection="list" item="id" open="(" close=")" separator=",">
            #{id}
    </foreach>
</select>

<!-- 批量插入 -->
<insert id="batchInsertUsers" parameterType="list">
    INSERT INTO users (name, email, age) VALUES
    <foreach collection="list" item="user" separator=",">
            (#{user.name}, #{user.email}, #{user.age})
    </foreach>
</insert>

<trim> 标签

作用

比 where 和 set 更灵活的标签,可自定义前后缀

属性说明

  • prefix: 添加前缀
  • suffix: 添加后缀
  • prefixOverrides: 去除的前缀
  • suffixOverrides: 去除的后缀
java 复制代码
<!-- trim替代where -->
<select id="selectByTrim" parameterType="map" resultType="User">
    SELECT * FROM users
    <trim prefix="WHERE" prefixOverrides="AND |OR ">
    <if test="name != null">
        AND name = #{name}
    </if>
    <if test="email != null">
        AND email = #{email}
    </if>
</select>

<!-- trim替代set -->
<update id="updateByTrim" parameterType="User">
    UPDATE users
    <trim prefix="SET" suffixOverrides=",">
        <if test="name != null">
            name = #{name},
        </if>
    </trim>
</update>
相关推荐
薪火铺子7 分钟前
Spring Security 6.x 实战指南
java·后端·spring
善恶怪客19 分钟前
Java-数据类型
java
学习3人组24 分钟前
Mes全连路架构图
java·erp
上弦月-编程30 分钟前
C语言指针从入门到实战
java·jvm·算法
Cyan_RA931 分钟前
SpringMVC 请求数据绑定与参数映射 详解
java·后端·spring·mvc·springmvc·映射请求数据
逻辑驱动的ken35 分钟前
Java高频面试考点场景题20
java·开发语言·深度学习·面试·职场和发展
bzmK1DTbd36 分钟前
Java游戏服务器:Netty框架的高并发网络通信
java·服务器·游戏
longxibo38 分钟前
【Flowable 7.2 源码深度解析与实战-前言】
java·后端·流程图
小龙报1 小时前
【Coze-AI智能体平台】低代码省时高效:Coze 应用开发全流程指南
java·人工智能·python·深度学习·低代码·chatgpt·交互
勿忘初心12211 小时前
【Java实战】SpringBoot 集成 freemarker 导出 Word 模板
java·spring boot·freemarker·模板引擎·word导出·后端实战