Mybatis学习笔记(4)-高级映射之一对多映射

MyBatis学习笔记(1)—使用篇

MyBatis学习笔记(2)—映射关系篇sql

MyBatis学习笔记(3)—高级映射之一对一映射bash

Mybatis学习笔记(4)-高级映射之一对多映射app

Mybatis学习笔记(5)-高级映射之多对多映射 敬请期待...post

这一节紧跟上一节MyBatis学习笔记(3)—高级映射之一对一映射,用的数据表也是同样的。回忆上一节的数据表,想一想哪些表之间是一对多的关系。学习

很明显订单表(orders)和订单项(orderitems)是一对多的关系:测试

orders表的 order_num是惟一的,可是同一个 orders表能够对应多个 orderitems,这些 orderitemsorder_num都与对应的 ordersorder_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;
    ...
复制代码

定义ResultMap

由于上一节咱们已经定义了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

定义select语句

因为继承了上一节的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中的各个属性也是有值的。

相关文章
相关标签/搜索