Mybatis学习笔记(5)-高级映射之多对多映射 敬请期待...post
这一节紧跟上一节MyBatis学习笔记(3)—高级映射之一对一映射,用的数据表也是同样的。回忆上一节的数据表,想一想哪些表之间是一对多的关系。学习
很明显订单表(orders)和订单项(orderitems)是一对多的关系:测试
orders
表的
order_num
是惟一的,可是同一个
orders
表能够对应多个
orderitems
,这些
orderitems
的
order_num
都与对应的
orders
的
order_num
一致。
首先准备查询的SQL语句:ui
SELECT o.*, oi.order_item, oi.prod_id, oi.quantity, oi.item_price
FROM orders AS o, orderitems AS oi
WHERE o.order_num=oi.order_num
复制代码
若是按照上一节的套路,那首先应该讲解返回值使用resultType,可是若是返回值是resultType定义的POJO的话,那么无疑查询出来的POJO信息的前半段都会包含大量重复的订单信息,因此这时候咱们最好返回resultMap,主要思路就是在Orders类中添加List orderitems属性,这样查询一个订单信息,它所包含的订单项也会反映在它的orderitems属性中。spa
因此此时的Orders包含如下属性:code
public class Orders {
private Integer orderNum;
private Date orderDate;
private Integer custId;
private Customer customer;
private List<OrderItems> orderItems;
...
复制代码
由于上一节咱们已经定义了OrdersCustomerResultMap
,如今咱们仅仅添加了一个orderItems属性,因此咱们能够继承上一节的ResultMap,定义以下:cdn
<resultMap id="OrderAndOrderItemsResultMap" type="com.shuqing28.pojo.Orders" extends="OrdersCustomerResultMap">
<collection property="orderItems" ofType="com.shuqing28.pojo.OrderItems">
<id column="order_num" property="orderNum" />
<id column="order_item" property="orderItem"/>
<result column="prod_id" property="prodId"/>
<result column="quantity" property="quantity"/>
<result column="item_price" property="itemPrice"/>
</collection>
</resultMap>
复制代码
由于添加的orderItems是一个List集合对象,因此这里用collection定义新元素,第一行最后extends也反映咱们是继承的上一节的OrdersCustomerResultMap
。
因为继承了上一节的resultMap,因此咱们的查询仍是附带Customer信息,因此最终的SQL以下:
<select id="findOrderAndItemsMap" resultMap="OrderAndOrderItemsResultMap">
SELECT o.order_num,o.order_date, c.*, oi.order_item, oi.prod_id, oi.quantity, oi.item_price
FROM orders AS o, customers AS c, orderitems AS oi
WHERE o.cust_id = c.cust_id
AND o.order_num=oi.order_num
</select>
复制代码
这样就是3表联查,也稍微扩充了下咱们的场景。
固然咱们还得在DAO类中声明接口
public List<Orders> findOrderAndItemsMap();
复制代码
@Test
public void findOrderAndItemsMap(){
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
List<Orders> orders = ordersDao.findOrderAndItemsMap();
System.out.println(orders);
} finally {
sqlSession.close();
}
}
复制代码
能够发现orders仍是有5个,查看第一个orders,包含了4个orderItems,而后具体的orderItems中的各个属性也是有值的。