MyBatis 实现一对一关联查询通常使用嵌套查询或者嵌套结果的方式。
1. 嵌套查询(Nested Queries)
步骤:
- 定义两个 SQL 查询语句: 一个查询主对象,另一个查询关联对象。
-
在主查询的 ResultMap 中使用
<association>
元素进行关联映射: 使用<association>
元素来映射关联对象,并指定关联查询语句。
示例:
<!-- 主对象查询 -->
<select id="getUserById" resultMap="userWithDetailResult">
SELECT * FROM users WHERE user_id = #{userId}
</select>
<!-- 关联对象查询 -->
<select id="getUserDetailById" resultMap="userDetailResult">
SELECT * FROM user_details WHERE user_id = #{userId}
</select>
<!-- 主对象 ResultMap -->
<resultMap id="userWithDetailResult" type="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<!-- 嵌套查询关联对象 -->
<association property="detail" ofType="UserDetail" select="getUserDetailById"/>
</resultMap>
2. 嵌套结果(Nested Results)
步骤:
- 定义单个 SQL 查询语句: 在查询中包含关联对象的字段,并使用嵌套的
<resultMap>
来映射关联对象。
示例:
<!-- 单个查询语句,同时获取主对象和关联对象 -->
<select id="getUserWithDetail" resultMap="userWithDetailResult">
SELECT u.user_id, u.username, ud.address, ud.phone_number
FROM users u LEFT JOIN user_details ud ON u.user_id = ud.user_id
WHERE u.user_id = #{userId}
</select>
<!-- 嵌套的 ResultMap -->
<resultMap id="userWithDetailResult" type="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<!-- 嵌套关联对象的 ResultMap -->
<association property="detail" javaType="UserDetail" resultMap="userDetailResult"/>
</resultMap>
这两种方式均可实现一对一关联查询,可以根据实际情况选择更适合的方式来查询和映射一对一关联的对象。
Was this helpful?
0 / 0