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>- 作用:在其他SQL语句中引入一个由
2. 结果映射 (Result Mapping)
这是MyBatis最强大的功能之一,用于将查询结果集(ResultSet)映射到Java对象。
<resultMap>- 作用:定义数据库结果集与Java对象属性之间的映射关系。当你需要处理复杂的关联查询(一对一、一对多)或列名与属性名不匹配时,它比简单的
resultType要强大得多。 - 核心属性:
id(唯一标识)、type(映射的Java对象类型)。
- 作用:定义数据库结果集与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')映射到Car或Truck对象。
- 作用:处理类似“继承”关系的映射。根据结果集中某个列的值,来决定具体使用哪个
<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>- 作用:类似于Java中的
<where>- 作用:智能地处理
WHERE子句。它只会插入WHERE关键字一次,并且会自动移除子句开头多余的AND或OR。
- 作用:智能地处理
<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子句。
- 作用:允许你在OGNL表达式之外创建一个变量,并将其绑定到上下文中。常用于构建模糊查询的
4. 缓存 (Caching)
<cache>- 作用:为当前命名空间(即当前的XML文件)开启二级缓存。可以配置缓存的实现、刷新策略、大小等。
- 示例:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
<cache-ref>- 作用:让当前的命名空间共享另一个命名空间的缓存配置。
5. 其他标签
<selectKey>- 作用:用于在
insert语句中获取数据库自动生成的主键(如自增ID)。它可以在insert执行之前或之后运行。 - 核心属性:
keyProperty(主键对应的Java对象属性)、resultType(主键类型)、order(BEFORE或AFTER)。
- 作用:用于在
<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对象的交互。