mybatis级联查询一对多
时间: 2023-11-07 19:58:04 浏览: 108
MyBatis提供了一种简便的方式来实现一对多的级联查询。在这种情况下,一个实体类中包含了多个子实体类的集合,这些子实体类与该实体类是一对多的关系。
下面是一对多的级联查询的示例:
1. 首先,我们创建以下两个实体类:
Order.java
```java
public class Order {
private int id;
private String code;
private List<OrderItem> items;
// 省略getter和setter方法
}
```
OrderItem.java
```java
public class OrderItem {
private int id;
private int orderId;
private String product;
private int quantity;
// 省略getter和setter方法
}
```
2. 接下来,我们需要创建一个映射文件来进行一对多的级联查询。在这个映射文件中,我们需要使用`<collection>`标签来定义一个集合属性,用来存储子实体类的列表。
OrderMapper.xml
```xml
<mapper namespace="com.example.OrderMapper">
<resultMap id="orderMap" type="com.example.Order">
<id property="id" column="id"/>
<result property="code" column="code"/>
<collection property="items" ofType="com.example.OrderItem">
<id property="id" column="item_id"/>
<result property="product" column="product"/>
<result property="quantity" column="quantity"/>
</collection>
</resultMap>
<select id="getOrders" resultMap="orderMap">
SELECT o.id, o.code, i.id as item_id, i.product, i.quantity
FROM orders o
LEFT JOIN order_items i ON o.id = i.order_id
ORDER BY o.id
</select>
</mapper>
```
在这个映射文件中,我们使用了`<resultMap>`标签来定义一个结果集映射,它包含了一个`<collection>`标签来定义子实体类的集合属性。在查询语句中,我们使用了`LEFT JOIN`来将订单和订单项关联起来,并使用`ORDER BY`子句来按订单ID排序。
3. 最后,我们需要创建一个接口来调用映射文件中的查询方法。
OrderMapper.java
```java
public interface OrderMapper {
List<Order> getOrders();
}
```
现在,我们可以使用这个接口来查询订单和订单项的信息,如下所示:
```java
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
List<Order> orders = orderMapper.getOrders();
for (Order order : orders) {
System.out.println(order.getCode());
for (OrderItem item : order.getItems()) {
System.out.println("\t" + item.getProduct() + " x" + item.getQuantity());
}
}
```
这个示例中,我们首先创建了一个`SqlSessionFactory`对象,然后使用它来创建一个`SqlSession`对象。接下来,我们使用`getMapper()`方法来获取一个`OrderMapper`接口的实现类。最后,我们调用查询方法来获取订单和订单项的信息,并遍历结果集来输出这些信息。
阅读全文