常用的 MyBatis 标签及其作用

MyBatis 是一个优秀的持久层框架,它通过 XML 或注解的方式将 Java 对象与数据库操作进行映射。在 MyBatis 的 XML 映射文件中,可以使用多种标签来定义 SQL 语句、参数映射、结果映射等。以下是一些常用的 MyBatis 标签及其作用:


1. 基本标签

1.1 <select>

用于定义查询语句。

xml 复制代码
<select id="selectUser" resultType="User">
    SELECT * FROM user WHERE id = #{id}
</select>
  • id:唯一标识符,用于在 Java 代码中调用。
  • resultType:返回结果的类型(可以是 Java 类型或别名)。
  • resultMap :引用一个结果映射(<resultMap>)。
1.2 <insert>

用于定义插入语句。

xml 复制代码
<insert id="insertUser" parameterType="User">
    INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
  • parameterType:参数类型(可以是 Java 类型或别名)。
  • useGeneratedKeys:是否使用数据库生成的主键。
  • keyProperty:将生成的主键值赋值给哪个属性。
1.3 <update>

用于定义更新语句。

xml 复制代码
<update id="updateUser" parameterType="User">
    UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
1.4 <delete>

用于定义删除语句。

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

2. 参数映射标签

2.1 <parameterMap>(已废弃)

用于定义参数映射(不推荐使用,建议使用 parameterType@Param 注解)。

2.2 <parameter>

用于定义参数映射的细节(通常与 <parameterMap> 一起使用,已废弃)。


3. 结果映射标签

3.1 <resultMap>

用于定义复杂的结果映射。

xml 复制代码
<resultMap id="userResultMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
</resultMap>
  • id:唯一标识符。
  • type:映射的 Java 类型。
  • <id>:主键字段映射。
  • <result>:普通字段映射。
3.2 <result>

用于定义单个字段的映射。

xml 复制代码
<result property="name" column="name"/>
  • property:Java 对象的属性名。
  • column:数据库表的列名。
3.3 <association>

用于映射一对一关联关系。

xml 复制代码
<association property="department" javaType="Department">
    <id property="id" column="dept_id"/>
    <result property="name" column="dept_name"/>
</association>
  • property:Java 对象的属性名。
  • javaType:关联对象的类型。
3.4 <collection>

用于映射一对多关联关系。

xml 复制代码
<collection property="orders" ofType="Order">
    <id property="id" column="order_id"/>
    <result property="orderNo" column="order_no"/>
</collection>
  • property:Java 对象的属性名。
  • ofType:集合中元素的类型。

4. 动态 SQL 标签

4.1 <if>

用于条件判断。

xml 复制代码
<select id="findUser" resultType="User">
    SELECT * FROM user
    WHERE 1=1
    <if test="name != null">
        AND name = #{name}
    </if>
    <if test="age != null">
        AND age = #{age}
    </if>
</select>
  • test:判断条件(OGNL 表达式)。
4.2 <choose><when><otherwise>

用于多条件判断。

xml 复制代码
<select id="findUser" resultType="User">
    SELECT * FROM user
    WHERE 1=1
    <choose>
        <when test="name != null">
            AND name = #{name}
        </when>
        <when test="age != null">
            AND age = #{age}
        </when>
        <otherwise>
            AND status = 1
        </otherwise>
    </choose>
</select>
4.3 <where>

用于动态生成 WHERE 子句,并自动处理前缀 ANDOR

xml 复制代码
<select id="findUser" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>
4.4 <set>

用于动态生成 SET 子句,并自动处理后缀逗号。

xml 复制代码
<update id="updateUser" parameterType="User">
    UPDATE user
    <set>
        <if test="name != null">
            name = #{name},
        </if>
        <if test="age != null">
            age = #{age},
        </if>
    </set>
    WHERE id = #{id}
</update>
4.5 <trim>

用于自定义字符串截取。

xml 复制代码
<update id="updateUser" parameterType="User">
    UPDATE user
    <trim prefix="SET" suffixOverrides=",">
        <if test="name != null">
            name = #{name},
        </if>
        <if test="age != null">
            age = #{age},
        </if>
    </trim>
    WHERE id = #{id}
</update>
  • prefix:前缀。
  • suffixOverrides:需要移除的后缀。
4.6 <foreach>

用于遍历集合。

xml 复制代码
<select id="findUsersByIds" resultType="User">
    SELECT * FROM user
    WHERE id IN
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>
  • collection:集合属性名。
  • item:集合中元素的别名。
  • open:开始符号。
  • separator:分隔符。
  • close:结束符号。

5. 其他标签

5.1 <sql>

用于定义可重用的 SQL 片段。

xml 复制代码
<sql id="userColumns">
    id, name, age
</sql>

<select id="selectUser" resultType="User">
    SELECT <include refid="userColumns"/> FROM user
</select>
5.2 <include>

用于引用 <sql> 标签定义的 SQL 片段。

xml 复制代码
<select id="selectUser" resultType="User">
    SELECT <include refid="userColumns"/> FROM user
</select>

6. 总结

MyBatis 提供了丰富的 XML 标签来定义 SQL 语句、参数映射、结果映射以及动态 SQL。常用的标签包括:

  • 基本标签<select><insert><update><delete>
  • 结果映射标签<resultMap><result><association><collection>
  • 动态 SQL 标签<if><choose><where><set><foreach>
  • 其他标签<sql><include>

掌握这些标签的使用,可以更灵活地编写 MyBatis 的 SQL 映射文件。


7. 面试回答建议

在面试中回答这个问题时,可以按照以下思路:

  1. 分类介绍 MyBatis 的常用标签(基本标签、结果映射标签、动态 SQL 标签等)。
  2. 结合实际项目经验,举例说明如何使用这些标签。
  3. 强调动态 SQL 标签的优势(如 <if><foreach> 等)。

这样回答既展示了你的技术深度,也体现了你对 MyBatis 的熟练使用。

相关推荐
喜欢敲代码的程序员18 小时前
SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:项目搭建(一)
spring boot·mysql·elementui·vue·mybatis
一只猿Hou1 天前
java分页插件| MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践
java·mybatis
java—大象11 天前
基于java SSM的房屋租赁系统设计和实现
java·开发语言·数据库·spring boot·layui·mybatis
Mutig_s11 天前
Spring Boot动态数据源切换:优雅实现多数据源管理
java·数据库·spring boot·后端·mybatis
编程乐学(Arfan开发工程师)11 天前
73、单元测试-断言机制
服务器·数据库·servlet·单元测试·sqlite·log4j·mybatis
小时候的阳光11 天前
MyBatis 的一级缓存导致的数据一致性问题分析
缓存·mybatis·事务·隔离级别
烙印60111 天前
MyBatis原理剖析(三)--加载配置文件
服务器·tomcat·mybatis
demon755200312 天前
Mybatis-Plus支持多种数据库
mybatis·多数据库
能工智人小辰12 天前
二刷苍穹外卖 day03
java·开发语言·mybatis