mybatis一对多映射
时间: 2023-09-21 21:10:48 浏览: 42
MyBatis的一对多映射可以通过使用嵌套查询或嵌套结果映射来实现。下面是两种方法的详细说明:
1. 嵌套查询
在一对多关系中,通常是一方有多个子项,我们可以使用嵌套查询来实现这种映射。例如,我们有两个表:`order`和`order_item`,`order`表有一个`id`字段,`order_item`表有一个`order_id`字段,用于将订单与订单项关联起来。
我们可以使用以下Mapper XML来查询一个订单及其所有订单项:
```xml
<select id="getOrderWithItems" resultMap="orderMap">
SELECT * FROM order WHERE id = #{id}
</select>
<resultMap id="orderMap" type="Order">
<id column="id" property="id"/>
<result column="order_no" property="orderNo"/>
<result column="create_time" property="createTime"/>
<collection property="orderItems" ofType="OrderItem">
<select id="getOrderItemsByOrderId" parameterType="int" resultMap="itemMap">
SELECT * FROM order_item WHERE order_id = #{id}
</select>
</collection>
</resultMap>
<resultMap id="itemMap" type="OrderItem">
<id column="id" property="id"/>
<result column="product_id" property="productId"/>
<result column="product_name" property="productName"/>
<result column="price" property="price"/>
<result column="quantity" property="quantity"/>
</resultMap>
```
在上面的代码中,`getOrderWithItems`方法将返回一个包含订单及其所有订单项的完整对象图。在`resultMap`元素中,我们定义了一个`collection`元素,并将其`property`属性设置为`orderItems`,这是`Order`类中的一个`List<OrderItem>`属性。`ofType`属性指定了集合中存储的对象类型,这里是`OrderItem`。`select`元素中的SQL语句将查询该订单的所有订单项,并将它们映射到`OrderItem`对象中。这个查询将在MyBatis执行`getOrderWithItems`方法时自动执行。
2. 嵌套结果映射
除了嵌套查询之外,我们还可以使用嵌套结果映射来实现一对多映射。
```xml
<select id="getOrderWithItems" resultMap="orderMap">
SELECT * FROM order WHERE id = #{id}
</select>
<resultMap id="orderMap" type="Order">
<id column="id" property="id"/>
<result column="order_no" property="orderNo"/>
<result column="create_time" property="createTime"/>
<collection property="orderItems" ofType="OrderItem" resultMap="itemMap"/>
</resultMap>
<resultMap id="itemMap" type="OrderItem">
<id column="id" property="id"/>
<result column="product_id" property="productId"/>
<result column="product_name" property="productName"/>
<result column="price" property="price"/>
<result column="quantity" property="quantity"/>
<result column="order_id" property="orderId"/>
</resultMap>
```
在上面的代码中,我们在`resultMap`元素中定义了一个`collection`元素,它将订单的所有订单项映射到`Order`对象的`orderItems`属性中。与嵌套查询不同的是,我们使用了一个名为`itemMap`的嵌套结果映射来映射每个订单项。这个映射定义了`OrderItem`类中的所有属性,并将`order_id`列映射到`orderId`属性上。
在使用嵌套结果映射时,MyBatis会将每个嵌套结果映射作为单独的查询执行。这意味着如果我们查询10个订单,就会执行11个查询(一个查询用于获取订单,另外10个查询用于获取每个订单的订单项)。因此,在使用嵌套结果映射时需要注意性能问题。