那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 编写需求。


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

相关推荐
gb4215287几秒前
向量数据库多模态特性
数据库
泡海椒22 分钟前
数据占比展示:jquick-pdf饼图动态数据渲染PDF教程
数据库·oracle·pdf
大连好光景37 分钟前
向量数据库的工作流程详解
数据库·milvus
catchadmin39 分钟前
用 Jev 与 Laravel AI SDK 检测垃圾邮件和自动回复
数据库·人工智能·laravel
吠品2 小时前
CSS图片模糊过渡:一个transition加filter就够
java·数据库·notepad++
梦想不只是梦与想3 小时前
对象存储服务器vs数据库
数据库·对象存储·图片存储
Ivanqhz3 小时前
正余弦位置编码(Sinusoidal Positional Encoding)
java·linux·数据库
Ivanqhz4 小时前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法
Java后端的Ai之路4 小时前
Python进阶探索23 - Python中的Time与Datetime模块
开发语言·数据库·python·datetime·time
通信瓦工5 小时前
利用浊度和电导率测量确定乙二醇基流体的质量
网络·数据库·ai