<resultMap>
标签
<resultMap>
标签通常在 MyBatis 的映射文件(XML 配置文件)中定义,其基本结构如下:
<resultMap id="resultMapId" type="fullyQualifiedClassName">
<id property="idColumnName" column="idColumn" />
<result property="propertyName" column="columnName" />
<!-- 更多的 <result> 标签 -->
</resultMap>
注意点:type最好从包名下开始,如com.example.fullyQualifiedClassName
组成部分
- id: 用于定义唯一标识符的映射。在结果集中,应该只有一个
<id>
标签,因为它表示唯一键。property
: Java 对象的属性名。column
: 数据库表中的列名。
- result: 用于定义非唯一键的映射。
property
: Java 对象的属性名。column
: 数据库表中的列名。
进阶特性
- 自动映射:
- 如果查询结果中的列名与 Java 对象的属性名完全相同,可以使用
<resultMap>
的autoMapping
属性自动映射这些字段。
- 如果查询结果中的列名与 Java 对象的属性名完全相同,可以使用
- 关联查询:
- 当查询涉及多表连接并且需要将结果映射到关联对象时,可以使用
<association>
标签。
<resultMap id="userWithRoles" type="User"> <id property="id" column="id" /> <result property="username" column="username" /> <association property="roles" javaType="Role"> <result property="roleId" column="role_id" /> <result property="roleName" column="role_name" /> </association> </resultMap>
- 当查询涉及多表连接并且需要将结果映射到关联对象时,可以使用
- 集合映射:
- 当需要将结果集中的多行数据映射到一个集合属性时,可以使用
<collection>
标签。
<resultMap id="userWithOrders" type="User"> <id property="id" column="id" /> <result property="username" column="username" /> <collection property="orders" ofType="Order"> <id property="id" column="order_id" /> <result property="orderDate" column="order_date" /> </collection> </resultMap>
- 当需要将结果集中的多行数据映射到一个集合属性时,可以使用
- 复杂类型映射:
- 对于复杂类型,如 Java 中的
Date
,可以使用<result>
标签的typeHandler
属性指定类型处理器。
- 对于复杂类型,如 Java 中的
- Discriminator:
- 用于基于某个字段的值来返回不同类型的结果。这在处理继承结构或多态时非常有用。
<resultMap id="discriminatorExample" type="com.example.BaseClass"> <discriminator column="type" javaType="int" typeHandler="com.example.IntTypeHandler"> <case value="1" resultType="com.example.SubClass1"/> <case value="2" resultType="com.example.SubClass2"/> </discriminator> </resultMap>
使用示例
假设有一个 User
类和一个 Order
类,你想要执行一个查询,该查询返回用户及其所有订单的信息:
<resultMap id="userWithOrdersResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="username" />
<collection property="orders" ofType="Order">
<id property="id" column="order_id" />
<result property="orderDate" column="order_date" />
</collection>
</resultMap>
在这个例子中,<resultMap>
定义了如何将查询结果映射到 User
对象及其 orders
集合属性。
<trim>
标签
<trim>
标签是一个非常有用的动态 SQL 元素,它允许你构建一个 SQL 语句的片段,其中可以包含多个子元素,这些子元素可以是 <where>
、<set>
、<foreach>
等。<trim>
标签会自动地根据子元素的存在与否来添加或省略 SQL 语句中的某些部分,如逗号、空格和关键字。
基本用法
<trim>
标签通常用于构建动态 SQL,它有以下几个常用的属性:
prefix
:在 SQL 片段前添加的文本。prefixOverrides
:移除 SQL 片段前多余的文本。suffix
:在 SQL 片段后添加的文本。suffixOverrides
:移除 SQL 片段后多余的文本。
示例
假设你有一个用户表 users
,表结构如下:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100),
status VARCHAR(10)
);
你想要构建一个动态查询,根据传入的条件动态地生成 SQL 语句。以下是使用 <trim>
标签的一个示例:
<select id="selectUsers" resultType="User">
SELECT id, username, email, status
FROM users
<where>
<trim suffixOverrides="AND ">
AND username LIKE CONCAT('%', #{username}, '%')
<if test="email != null">
AND email = #{email}
</if>
<if test="status != null">
AND status = #{status}
</if>
</trim>
</where>
</select>
在这个例子中:
prefixOverrides="AND "
用于移除最后一个条件前多余的 “AND “。<where>
标签会自动处理 SQL 中的 “WHERE” 关键字,如果<trim>
中的条件都不满足,”WHERE” 关键字将不会被包含在最终的 SQL 语句中。<if>
标签用于条件判断,只有当测试表达式为真时,相应的 SQL 片段才会被包含在最终的 SQL 语句中。
动态 SQL 示例
假设你调用 selectUsers
方法,并传入 username
为 "John"
,但不传入 email
和 status
,则生成的 SQL 语句如下:
SELECT id, username, email, status
FROM users
WHERE username LIKE CONCAT('%John%')
如果你传入 username
为 "John"
,email
为 "john@example.com"
,和 status
为 "active"
,则生成的 SQL 语句如下:
SELECT id, username, email, status
FROM users
WHERE username LIKE CONCAT('%John%')
AND email = 'john@example.com'
AND status = 'active'
注意事项
- 使用
<trim>
标签时,要注意正确设置prefixOverrides
和suffixOverrides
属性,以避免生成无效的 SQL 语句。 <trim>
标签通常与<where>
、<set>
等标签一起使用,以构建动态的 WHERE 子句和 SET 子句。- MyBatis 会自动处理 SQL 语句中的空格和逗号,确保生成的 SQL 语句是有效的。