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

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

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

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

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

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

假设咱们如今有这样的需求,想知道某一位顾客购买了哪些商品,可是经过观察customers表和products表,咱们发现这两张表并无关联,那么怎么办呢?经过前面的例子,咱们能够发现,经由orders和orderitems这两张表,customers表和products表能创建起间接联系。post

咱们以customer表做为主表,那么查询的语句应该是学习

SELECT c.*, o.*, oi.*, p.*
FROM customers AS c, orders AS o, orderitems AS oi, products AS p
WHERE c.cust_id=o.cust_id
AND o.order_num=oi.order_num
AND oi.prod_id=p.prod_id
复制代码

根据上一节的解释,若是咱们使用resultType来定义返回类型,那么定义的POJO类将会包含不少类似的部分,因此最好仍是采用resultMap来定义返回的类型,这样咱们就能够在原有的Customer类上扩展属性来存储订单,那么订单属性内部就会包含订单项,而订单项就会跟具体的商品关联,关联关系看上面的图很容易明白。测试

那么咱们具体来看看类被咱们定义成什么样子了。ui

POJO定义

public class Customer {
    private Integer custId;
    private String custName;
    private String custAddress;
    private String custCity;
    private String custState;
    private String custZip;
    private String custCountry;
    private String custContact;
    private String custEmail;
    //新增的orderList用于存储该客户所下的订单
    List<Orders> ordersList;
复制代码

Orders类中咱们把原先的Customer属性删去,别的都不动spa

Orders中包含OrderItems属性,OrderItems这么定义:code

public class OrderItems {
    private Integer orderNum;
    private Integer orderItem;
    private String prodId;
    private Integer quantity;
    private Double itemPrice;
    //新增的商品类,那么就能够看到订单项中包含的商品的具体信息
    private Products products;
复制代码

定义resultMap

<resultMap id="CustomerAndProductsMap" type="com.shuqing28.pojo.Customer">
        <id column="cust_id" property="custId"/>
        <result column="cust_name" property="custName"/>
        <result column="cust_address" property="custAddress"/>
        <result column="cust_city" property="custCity"/>
        <result column="cust_state" property="custState"/>
        <result column="cust_zip" property="custZip"/>
        <result column="cust_country" property="custCountry"/>
        <result column="cust_contact" property="custContact"/>
        <result column="cust_email" property="custEmail"/>

        <collection property="ordersList" ofType="com.shuqing28.pojo.Orders">
            <id column="order_num" property="orderNum"/>
            <result column="order_date" property="orderDate"/>
            <result column="cust_id" property="custId"/>
            <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"/>
                <association property="products" javaType="com.shuqing28.pojo.Products">
                    <id column="prod_id" property="prodId"/>
                    <result column="vend_id" property="vendId"/>
                    <result column="prod_name" property="prodName"/>
                    <result column="prod_price" property="prodPrice"/>
                    <result column="prod_desc" property="prodDesc"/>
                </association>
            </collection>
        </collection>
    </resultMap>
复制代码

咱们从resultMap的定义中就能够看出从Customer到Products的嵌套关系。下面继续看查询语句定义:

<select id="findCustomerProducts" resultMap="CustomerAndProductsMap">
        SELECT c.*, o.*, oi.*, p.*
        FROM customers AS c, orders AS o, orderitems AS oi, products AS p
        WHERE c.cust_id=o.cust_id
        AND o.order_num=oi.order_num
        AND oi.prod_id=p.prod_id
    </select>
复制代码

经过一系列内链接,查询出与customer有关联的products。

定义接口:

public List<Customer> findCustomerProducts();
复制代码

测试代码:

@Test
    public void findCustomersProductsMap(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
            List<Customer> customerProducts = ordersDao.findCustomerProducts();
            System.out.println(customerProducts);
        } finally {
            sqlSession.close();
        }
    }
复制代码

查询结果

从图中能够发现,在customer的orderList属性下有2个订单,每一个订单里会包含一个或多个订单项orderItems,每一个orderItem又会对应一个product。

这就是所谓的多对多查询,嵌套关系多一些。

相关文章
相关标签/搜索