一对一、一对多的关联查询 ?
时间: 2023-09-11 19:13:23 浏览: 132
mysql一对多关联查询分页错误问题的解决方法
5星 · 资源好评率100%
在 MyBatis 中,可以通过 `<resultMap>` 标签和 SQL 查询语句的编写来实现一对一和一对多的关联查询。
1. 一对一关联查询:
假设有两个实体类 `User` 和 `Order`,一个用户可以有一个订单。可以通过在 `<resultMap>` 中定义关联查询的映射关系,然后在 SQL 查询语句中使用 JOIN 来关联两个表。示例代码如下:
```xml
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
<result property="email" column="user_email"/>
<association property="order" javaType="Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<result property="amount" column="order_amount"/>
</association>
</resultMap>
<select id="getUserWithOrder" resultMap="userResultMap">
SELECT u.id AS user_id, u.username AS user_name, u.email AS user_email,
o.id AS order_id, o.order_no, o.amount AS order_amount
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.id = #{userId}
</select>
```
上述代码中,`<resultMap>` 定义了 `User` 实体类和 `Order` 实体类的关联关系,并指定了对应的列名。通过 LEFT JOIN 关联查询 `orders` 表,并将查询结果映射到 `User` 对象的 `order` 属性上。
2. 一对多关联查询:
假设有两个实体类 `User` 和 `Post`,一个用户可以有多个帖子。可以通过在 `<resultMap>` 中定义关联查询的映射关系,然后在 SQL 查询语句中使用关联子查询来获取用户的所有帖子。示例代码如下:
```xml
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
<result property="email" column="user_email"/>
<collection property="posts" ofType="Post">
<id property="id" column="post_id"/>
<result property="title" column="post_title"/>
<result property="content" column="post_content"/>
</collection>
</resultMap>
<select id="getUserWithPosts" resultMap="userResultMap">
SELECT u.id AS user_id, u.username AS user_name, u.email AS user_email,
p.id AS post_id, p.title AS post_title, p.content AS post_content
FROM user u
LEFT JOIN post p ON u.id = p.user_id
WHERE u.id = #{userId}
</select>
```
上述代码中,`<resultMap>` 定义了 `User` 实体类和 `Post` 实体类的关联关系,并指定了对应的列名。通过 LEFT JOIN 关联查询 `post` 表,并将查询结果映射到 `User` 对象的 `posts` 属性上。
通过以上方式,可以实现一对一和一对多的关联查询,并将查询结果正确地映射到实体类的属性上。
阅读全文