那xml对应的sql语法,列举一下

在 MyBatis 的 XML 映射文件中,SQL 语法主要可以分为三大类:基础 CRUD 操作标签 、动态 SQL 标签 以及辅助配置标签。

结合业界常用的开发规范,我为您系统梳理了这些标签及其对应的 SQL 语法和用法:

一、 基础 CRUD 操作标签

这四个标签对应了数据库中最基本的增删改查操作:

  1. <select> :定义查询语句。通过 id 绑定接口方法,resultType 或 resultMap 指定返回类型。

    xml 复制代码
    <select id="getUserById" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>
  2. <insert> :定义插入语句。常配合 useGeneratedKeys="true" 和 keyProperty="id" 实现自增主键回填。

    xml 复制代码
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user (name, age) VALUES (#{name}, #{age})
    </insert>
  3. <update> :定义更新语句。

    xml 复制代码
    <update id="updateUser">
        UPDATE user SET name = #{name} WHERE id = #{id}
    </update>
  4. <delete> :定义删除语句。

    xml 复制代码
    <delete id="deleteUser">
        DELETE FROM user WHERE id = #{id}
    </delete>

二、 动态 SQL 标签

这是 MyBatis 最强大的特性,允许根据传入参数的值动态拼接 SQL,避免在 Java 代码中手动拼接字符串:

  1. <if> :条件判断。当 test 属性中的 OGNL 表达式为 true 时,包含该段 SQL。

    xml 复制代码
    <if test="name != null">
        AND name = #{name}
    </if>
  2. <where> :智能处理 WHERE 子句。它会自动添加 WHERE 关键字,并智能去除开头多余的 AND 或 OR。

    xml 复制代码
    <where>
        <if test="name != null">AND name = #{name}</if>
        <if test="age != null">AND age = #{age}</if>
    </where>
  3. <set> :智能处理 UPDATE 语句的 SET 子句。自动添加 SET 关键字,并去除末尾多余的逗号。

    xml 复制代码
    <update id="updateUser">
        UPDATE user
        <set>
            <if test="name != null">name = #{name},</if>
            <if test="age != null">age = #{age},</if>
        </set>
        WHERE id = #{id}
    </update>
  4. <foreach> :循环遍历集合(如 List、Array)。常用于生成 IN (...) 查询或批量插入。

    xml 复制代码
    WHERE id IN
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
  5. <choose>, <when>, <otherwise> :多条件分支选择,类似于 Java 中的 switch-case 语句。只会执行第一个满足条件的 <when>,若都不满足则执行 <otherwise>。

    xml 复制代码
    <choose>
        <when test="id != null">AND id = #{id}</when>
        <when test="name != null">AND name = #{name}</when>
        <otherwise>AND status = 1</otherwise>
    </choose>
  6. <trim> :自定义字符串修剪。可以灵活地添加或去除 SQL 片段的前后缀(如 prefixOverrides 去除前导的 AND)。

  7. <bind> :创建变量并绑定到上下文。常用于模糊查询中拼接 % 号,例如 <bind name="pattern" value="'%' + keyword + '%'" />。

三、 辅助与配置标签

  1. <sql> 与 <include> :用于定义和复用 SQL 片段。将公共的查询列或条件提取出来,避免重复编写。

    xml 复制代码
    <sql id="userColumns">id, name, age</sql>
    <select id="getUsers" resultType="User">
        SELECT <include refid="userColumns"/> FROM user
    </select>
  2. <resultMap> :处理复杂的对象映射关系。当数据库字段名与 Java 对象属性名不一致,或涉及一对一、一对多关联查询时使用。

    xml 复制代码
    <resultMap id="UserResultMap" type="User">
        <id property="id" column="user_id"/>
        <result property="name" column="user_name"/>
    </resultMap>

总结:

在实际开发中,最常用的组合是 <select>/<update> + <where> + <if> (用于多条件组合查询和动态更新),以及 <foreach>(用于批量操作和 IN 查询)。掌握这些标签,基本可以覆盖 95% 以上的复杂 SQL 编写需求。


需要我把这些标签按使用场景整理成一份速查表吗?比如什么情况下用哪个标签,配个示例,开发时直接对照就行。

相关推荐
卓豪终端管理6 分钟前
300 台终端补丁推送完成 ≠ 漏洞关闭:补丁稽核闭环的状态机与工程落点
网络·数据库·php
l1t31 分钟前
DeepSeek总结的PostgreSQL 中的二进制只读副本,第三部分
数据库·postgresql
从零数据分析42 分钟前
零基础学SQL 23:和上月比总对不上?LAG/LEAD 一步取出上一次(附 4 个模板)
java·数据库·sql·mysql·oracle·sqlite·database
码士集团小青1 小时前
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
数据库·redis·缓存
太理摆烂哥1 小时前
MySQL的查询
数据库·mysql
码士集团小青1 小时前
硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
数据库·redis·缓存
钱栈up1 小时前
配料秤料位查出来是负数——IoTDB存的是周期增量,我却在拿首尾相减
前端·数据库
人丰1 小时前
一次生产卡顿复盘:BI 数据抽取引发 PostgreSQL 长事务事故
数据库·c#
程序员塔塔喵1 小时前
【MySQL篇|第四篇】事务隔离级别
数据库·mysql·事务隔离级别
oradh2 小时前
Oracle 外部表(External Tables)使用总结
数据库·oracle