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。

這就是所謂的多對多查詢,嵌套關係多一些。

相關文章
相關標籤/搜索