ssm多表查询
时间: 2023-07-25 13:09:24 浏览: 54
在 SSM(Spring + SpringMVC + MyBatis)框架中,多表查询需要用到 MyBatis 的关联查询功能,常用的关联查询方式有两种:嵌套查询和连接查询。
1. 嵌套查询
嵌套查询又叫子查询,是指在 SELECT 语句中嵌套另一个 SELECT 语句。在 MyBatis 中,可以使用 `<select>` 标签来实现嵌套查询。
例如,查询订单信息及其对应的商品信息:
```xml
<select id="getOrdersWithItems" resultMap="OrderItemMap">
SELECT o.id AS order_id, o.order_no, o.create_time,
i.id AS item_id, i.product_name, i.price, i.quantity
FROM orders o
INNER JOIN order_items i ON o.id = i.order_id
WHERE o.user_id = #{userId}
</select>
<resultMap id="OrderItemMap" type="Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<result property="createTime" column="create_time"/>
<collection property="items" ofType="OrderItem">
<id property="id" column="item_id"/>
<result property="productName" column="product_name"/>
<result property="price" column="price"/>
<result property="quantity" column="quantity"/>
</collection>
</resultMap>
```
这个查询语句中使用了 INNER JOIN 连接 orders 表和 order_items 表,然后使用 WHERE 子句过滤出指定用户的订单信息,并使用嵌套查询将订单信息和商品信息组合在一起。这个查询语句返回的结果是一个 Order 对象列表,每个 Order 对象都包含了多个 OrderItem 对象。
2. 连接查询
连接查询是指在 SELECT 语句中使用 JOIN 关键字将多个表连接在一起。在 MyBatis 中,可以使用 `<select>` 标签中的 `<resultMap>` 标签来实现连接查询。
例如,查询订单信息及其对应的用户信息和商品信息:
```xml
<select id="getOrdersWithUserAndItems" resultMap="OrderMap">
SELECT o.id AS order_id, o.order_no, o.create_time,
u.id AS user_id, u.username, u.email,
i.id AS item_id, i.product_name, i.price, i.quantity
FROM orders o
INNER JOIN users u ON o.user_id = u.id
INNER JOIN order_items i ON o.id = i.order_id
WHERE o.user_id = #{userId}
</select>
<resultMap id="OrderMap" type="Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<result property="createTime" column="create_time"/>
<association property="user" javaType="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="email" column="email"/>
</association>
<collection property="items" ofType="OrderItem">
<id property="id" column="item_id"/>
<result property="productName" column="product_name"/>
<result property="price" column="price"/>
<result property="quantity" column="quantity"/>
</collection>
</resultMap>
```
这个查询语句中使用了 INNER JOIN 连接 orders 表、users 表和 order_items 表,然后使用 WHERE 子句过滤出指定用户的订单信息,并使用连接查询将订单信息、用户信息和商品信息组合在一起。这个查询语句返回的结果是一个 Order 对象列表,每个 Order 对象都包含了一个 User 对象和多个 OrderItem 对象。