在 MyBatis 的 XML 映射文件中,SQL 语法主要可以分为三大类:基础 CRUD 操作标签 、动态 SQL 标签 以及辅助配置标签。
结合业界常用的开发规范,我为您系统梳理了这些标签及其对应的 SQL 语法和用法:
一、 基础 CRUD 操作标签
这四个标签对应了数据库中最基本的增删改查操作:
-
<select>:定义查询语句。通过id绑定接口方法,resultType或resultMap指定返回类型。xml<select id="getUserById" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> -
<insert>:定义插入语句。常配合useGeneratedKeys="true"和keyProperty="id"实现自增主键回填。xml<insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> -
<update>:定义更新语句。xml<update id="updateUser"> UPDATE user SET name = #{name} WHERE id = #{id} </update> -
<delete>:定义删除语句。xml<delete id="deleteUser"> DELETE FROM user WHERE id = #{id} </delete>
二、 动态 SQL 标签
这是 MyBatis 最强大的特性,允许根据传入参数的值动态拼接 SQL,避免在 Java 代码中手动拼接字符串:
-
<if>:条件判断。当test属性中的 OGNL 表达式为 true 时,包含该段 SQL。xml<if test="name != null"> AND name = #{name} </if> -
<where>:智能处理 WHERE 子句。它会自动添加WHERE关键字,并智能去除开头多余的AND或OR。xml<where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age = #{age}</if> </where> -
<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> -
<foreach>:循环遍历集合(如 List、Array)。常用于生成IN (...)查询或批量插入。xmlWHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> -
<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> -
<trim>:自定义字符串修剪。可以灵活地添加或去除 SQL 片段的前后缀(如prefixOverrides去除前导的AND)。 -
<bind>:创建变量并绑定到上下文。常用于模糊查询中拼接%号,例如<bind name="pattern" value="'%' + keyword + '%'" />。
三、 辅助与配置标签
-
<sql>与<include>:用于定义和复用 SQL 片段。将公共的查询列或条件提取出来,避免重复编写。xml<sql id="userColumns">id, name, age</sql> <select id="getUsers" resultType="User"> SELECT <include refid="userColumns"/> FROM user </select> -
<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 编写需求。
需要我把这些标签按使用场景整理成一份速查表吗?比如什么情况下用哪个标签,配个示例,开发时直接对照就行。