推荐答案
在 MyBatis 中,处理一对一、一对多、多对多的关系通常通过 resultMap 来实现。以下是每种关系的处理方式:
一对一关系
使用 <association> 标签来映射一对一关系。
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<association property="profile" javaType="Profile">
<id property="id" column="profile_id"/>
<result property="bio" column="bio"/>
</association>
</resultMap>一对多关系
使用 <collection> 标签来映射一对多关系。
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<collection property="posts" ofType="Post">
<id property="id" column="post_id"/>
<result property="title" column="title"/>
</collection>
</resultMap>多对多关系
多对多关系通常通过中间表来实现,使用 <collection> 标签来映射。
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<collection property="roles" ofType="Role">
<id property="id" column="role_id"/>
<result property="name" column="role_name"/>
</collection>
</resultMap>本题详细解读
一对一关系
在 MyBatis 中,一对一关系通常表示一个对象包含另一个对象的引用。例如,一个 User 对象可能包含一个 Profile 对象。通过 <association> 标签,可以将查询结果中的列映射到 Profile 对象的属性上。
一对多关系
一对多关系表示一个对象包含多个其他对象的集合。例如,一个 User 对象可能包含多个 Post 对象。通过 <collection> 标签,可以将查询结果中的多行数据映射到 Post 对象的集合上。
多对多关系
多对多关系通常通过中间表来实现。例如,一个 User 对象可能有多个 Role 对象,而一个 Role 对象也可能属于多个 User 对象。通过 <collection> 标签,可以将查询结果中的多行数据映射到 Role 对象的集合上。
示例 SQL 查询
以下是一个处理多对多关系的 SQL 查询示例:
SELECT u.id AS user_id, u.username, r.id AS role_id, r.name AS role_name
FROM users u
JOIN user_roles ur ON u.id = ur.user_id
JOIN roles r ON ur.role_id = r.id
WHERE u.id = #{userId}在这个查询中,user_roles 表是中间表,用于连接 users 表和 roles 表。通过 resultMap,可以将查询结果映射到 User 对象的 roles 集合中。