mybatis一对多查询代码
时间: 2023-11-20 19:04:57 浏览: 89
假设有两个表,一个是 `order` 表,一个是 `order_item` 表,其中一个订单可以对应多个订单项,下面是一个简单的 MyBatis 一对多查询的代码示例:
首先,我们需要定义两个实体类 `Order` 和 `OrderItem`,并建立它们之间的一对多关系。在 `Order` 实体类中,我们需要添加一个 `List<OrderItem>` 类型的属性来表示它包含的所有订单项,同时需要添加对应的 `getter` 和 `setter` 方法。在 `OrderItem` 实体类中,我们需要添加一个 `Order` 类型的属性来表示它对应的订单,同时需要添加对应的 `getter` 和 `setter` 方法。
```java
public class Order {
private Integer id;
private String orderNo;
private List<OrderItem> orderItems;
// getter 和 setter 方法
}
public class OrderItem {
private Integer id;
private Integer orderId;
private String itemNo;
private Order order;
// getter 和 setter 方法
}
```
然后,在 MyBatis 的 Mapper 接口中,我们可以定义一个方法来查询订单和订单项的一对多关系。下面是一个简单的示例:
```java
public interface OrderMapper {
Order selectOrderWithItems(Integer id);
}
```
这里的 `selectOrderWithItems` 方法会返回一个 `Order` 对象,表示指定订单及其所有订单项的信息。在这个方法中,我们可以使用 `select` 标签来进行一对多查询,并使用 `resultMap` 标签来映射查询结果到 `Order` 实体类中。下面是一个示例的 XML 配置:
```xml
<select id="selectOrderWithItems" parameterType="Integer" resultMap="orderResultMap">
SELECT o.*, oi.id AS item_id, oi.item_no
FROM `order` o LEFT JOIN order_item oi ON o.id = oi.order_id
WHERE o.id = #{id}
</select>
<resultMap id="orderResultMap" type="Order">
<id property="id" column="id"/>
<result property="orderNo" column="order_no"/>
<collection property="orderItems" ofType="OrderItem" resultMap="orderItemResultMap"/>
</resultMap>
<resultMap id="orderItemResultMap" type="OrderItem">
<id property="id" column="item_id"/>
<result property="itemNo" column="item_no"/>
<association property="order" column="order_id" select="selectOrderById"/>
</resultMap>
```
在这个 XML 配置中,我们定义了两个 `resultMap` 分别用于映射 `Order` 和 `OrderItem` 实体类。其中,`orderResultMap` 中使用了 `collection` 标签来定义 `orderItems` 属性,表示它包含多个 `OrderItem` 对象。而 `orderItemResultMap` 中使用了 `association` 标签来定义 `order` 属性,表示它对应一个 `Order` 对象,并且使用了 `select` 属性来定义一个额外的查询语句 `selectOrderById` 来查询对应的订单信息。
最后,在 Mapper 接口的实现类中,我们可以直接调用 `selectOrderWithItems` 方法并传入订单的 ID 来进行一对多查询。下面是一个示例代码:
```java
public class OrderMapperImpl implements OrderMapper {
private SqlSessionFactory sqlSessionFactory;
public OrderMapperImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public Order selectOrderWithItems(Integer id) {
try (SqlSession session = sqlSessionFactory.openSession()) {
return session.selectOne("selectOrderWithItems", id);
}
}
}
```
阅读全文