基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

XML映射文件中,除了常见的select|insert|update|delete标签,还有哪些标签?

知识点图片

总结了MyBatis XML中除四大基本操作标签外的核心标签,涵盖SQL重用、高级结果映射、动态SQL构建及缓存配置,展现其灵活性。

在MyBatis(或其前身iBatis)的XML映射文件中,除了您提到的四个核心的SQL操作标签(select, insert, update, delete)之外,还有许多功能强大且非常重要的标签。它们共同构成了MyBatis灵活性的基石。

这些标签主要可以分为以下几大类:


1. SQL 片段与重用 (SQL Snippets & Reusability)

这类标签用于定义可重用的SQL代码块,避免代码重复,提高可维护性。

  • <sql>

    • 作用:定义一个可被其他语句引用的SQL片段。
    • 示例:定义一个通用的列名列表。
    xml
    <sql id="baseColumns">
        id, title, author_id, content, create_time
    </sql>
  • <include>

    • 作用:在其他SQL语句中引入一个由<sql>标签定义的SQL片段。
    • 示例:在select语句中使用上面定义的列名。
    xml
    <select id="selectBlog" resultType="Blog">
        SELECT <include refid="baseColumns" />
        FROM blog
        WHERE id = #{id}
    </select>

2. 结果映射 (Result Mapping)

这是MyBatis最强大的功能之一,用于将查询结果集(ResultSet)映射到Java对象。

  • <resultMap>
    • 作用:定义数据库结果集与Java对象属性之间的映射关系。当你需要处理复杂的关联查询(一对一、一对多)或列名与属性名不匹配时,它比简单的resultType要强大得多。
    • 核心属性id(唯一标识)、type(映射的Java对象类型)。

<resultMap>内部,你会使用以下子标签:

  • <id>

    • 作用:标记作为对象唯一标识的属性,通常对应数据库主键。这样做有助于提高MyBatis内部处理嵌套查询和缓存的性能。
    • 示例<id property="id" column="blog_id" />
  • <result>

    • 作用:定义普通列与对象属性的映射。
    • 示例<result property="title" column="blog_title" />
  • <association>

    • 作用:处理“一对一”的关联关系。例如,一篇博客(Blog)关联一个作者(Author)。
    • 实现方式:可以是通过嵌套查询(发起一个新的SQL查询)或嵌套结果映射(在一次查询中处理所有关联数据)。
    • 示例
    xml
    <association property="author" javaType="Author">
        <id property="id" column="author_id" />
        <result property="username" column="author_username" />
    </association>
  • <collection>

    • 作用:处理“一对多”的关联关系。例如,一篇博客(Blog)有多条评论(Comment)。
    • 实现方式:与<association>类似,也有嵌套查询和嵌套结果映射两种方式。
    • 示例
    xml
    <collection property="comments" ofType="Comment">
        <id property="id" column="comment_id" />
        <result property="content" column="comment_content" />
    </collection>
  • <discriminator>

    • 作用:处理类似“继承”关系的映射。根据结果集中某个列的值,来决定具体使用哪个<resultMap>或映射到哪个子类。
    • 示例:一个“交通工具”表,根据type列的值('CAR', 'TRUCK')映射到CarTruck对象。
  • <constructor>

    • 作用:当Java对象没有默认的无参构造函数时,可以用它来指定使用哪个构造函数,并将结果集中的列作为参数注入。

3. 动态SQL (Dynamic SQL)

这是MyBatis的另一个核心特性,允许你根据不同的条件动态地构建SQL语句。

  • <if>

    • 作用:进行简单的条件判断。如果test表达式为true,则包含其内部的SQL片段。
    • 示例<if test="title != null">AND title = #{title}</if>
  • <choose>, <when>, <otherwise>

    • 作用:类似于Java中的switch语句,提供多选一的逻辑。
    • 示例
    xml
    <choose>
        <when test="status == 'ACTIVE'">AND status = 'ACTIVE'</when>
        <when test="status == 'INACTIVE'">AND status = 'INACTIVE'</when>
        <otherwise>AND status IS NOT NULL</otherwise>
    </choose>
  • <where>

    • 作用:智能地处理WHERE子句。它只会插入WHERE关键字一次,并且会自动移除子句开头多余的ANDOR
  • <set>

    • 作用:智能地处理UPDATE语句中的SET子句。它会插入SET关键字,并自动移除结尾多余的逗号。
  • <trim>

    • 作用:更通用的格式化标签,可以自定义添加前缀/后缀,并移除指定的前缀/后缀。<where><set>本质上是<trim>的特例。
  • <foreach>

    • 作用:用于遍历集合(如List, Array),常用于构建IN子句。
    • 示例
    xml
    <foreach item="id" collection="list" open="(" separator="," close=")">
        #{id}
    </foreach>
  • <bind>

    • 作用:允许你在OGNL表达式之外创建一个变量,并将其绑定到上下文中。常用于构建模糊查询的LIKE子句。

4. 缓存 (Caching)

  • <cache>

    • 作用:为当前命名空间(即当前的XML文件)开启二级缓存。可以配置缓存的实现、刷新策略、大小等。
    • 示例<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
  • <cache-ref>

    • 作用:让当前的命名空间共享另一个命名空间的缓存配置。

5. 其他标签

  • <selectKey>

    • 作用:用于在insert语句中获取数据库自动生成的主键(如自增ID)。它可以在insert执行之前或之后运行。
    • 核心属性keyProperty(主键对应的Java对象属性)、resultType(主键类型)、orderBEFOREAFTER)。
  • <parameterMap>

    • 作用:(已不推荐使用)用于外部定义参数映射。现在更推荐使用parameterType和内联参数#{}

总结

类别 标签 主要功能
核心操作 select, insert, update, delete 执行基本的增删改查SQL操作。
SQL重用 <sql>, <include> 定义和引用可重用的SQL代码片段。
结果映射 <resultMap>, <id>, <result>, <association>, <collection>, <discriminator> 将复杂的查询结果灵活地映射到Java对象及其关联对象。
动态SQL <if>, <choose>, <where>, <set>, <foreach> 根据不同条件动态构建SQL语句,实现灵活的查询逻辑。
缓存 <cache>, <cache-ref> 配置命名空间级别的二级缓存,提升性能。
特殊功能 <selectKey> 在插入操作后获取数据库自增主键。

这些标签共同使得MyBatis能够以一种非常灵活和强大的方式处理SQL,既保留了SQL的控制力,又简化了与Java对象的交互。

00:00
00:00