多对多映射
四张表关联查询。
业务需求:查询用户的信息,以及它所购买商品的订单信息、商品信息
业务分析:通过查询user表,查找到orders,通过orders表查找到对应的orderdetail,通过orderdetail表查到对应items。
user-用户表 、orders-订单表 、orderdetail-订单明细表 、items-商品表

1.创建实体类pojo
a.建立用户表的pojo:一个用户有多个订单,需要在用户表中加入订单列表

package com.example.data;

import java.util.List;

public class User {
    private int id;
    private String username;
    private String sex;

    //一个用户有多个订单,用户需要创建订单列表
    private List<Orders> ordersList;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public List<Orders> getOrdersList() {
        return ordersList;
    }

    public void setOrdersList(List<Orders> ordersList) {
        this.ordersList = ordersList;
    }
}

b.建立订单表的pojo:一个订单有多个订单明细,订单中需要创建订单的详细信息列表

package com.example.data;

import java.util.List;

public class Orders {
    private int id;
    private int userId;
    private String no;
    private String remark;

    //一个订单有多个订单明细,订单需要创建订单明细列表
    private List<Orderdetail> orderdetails;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public List<Orderdetail> getOrderdetails() {
        return orderdetails;
    }

    public void setOrderdetails(List<Orderdetail> orderdetails) {
        this.orderdetails = orderdetails;
    }
}

c.建立订单明细表的pojo:一个订单明细对应一个商品信息,需要创建商品信息属性

package com.example.data;

public class Orderdetail {
    private int id;
    private int ordersId;
    private int itemsId;
    private int itemsNo;

    //订单明细对应商品信息
    private Items items;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getOrdersId() {
        return ordersId;
    }

    public void setOrdersId(int ordersId) {
        this.ordersId = ordersId;
    }

    public int getItemsId() {
        return itemsId;
    }

    public void setItemsId(int itemsId) {
        this.itemsId = itemsId;
    }

    public int getItemsNo() {
        return itemsNo;
    }

    public void setItemsNo(int itemsNo) {
        this.itemsNo = itemsNo;
    }

    public Items getItems() {
        return items;
    }

    public void setItems(Items items) {
        this.items = items;
    }
}

d.建立商品表的pojo:

package com.example.data;

public class Items {
    private int id;
    private String name;
    private double price;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

2.编写Mapper.xml:

    <!--多对多查询:查询用户购买的商品的所有信息-->
    <resultMap id="UserAndItemsResultMap" type="com.example.data.User">
        <!--User表是主表,添加用户信息
            column:取得是数据库的列名,如果给数据库列名定义了别名,就取别名-->
        <id column="user_id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="sex" property="sex"></result>
        <!--订单信息-->
        <!--一个用户可以对应多个订单,使用collection一对多映射-->
        <collection property="ordersList" ofType="com.example.data.Orders">
            <id column="id" property="id"></id>
            <result column="user_id" property="userId"></result>
            <result column="no" property="no"></result>
            <result column="remark" property="remark"></result>
            <!--订单明细-->
            <!--一个订单包括多个明细,使用collection一对多映射
                column:取得是数据库的列名,如果给数据库列名定义了别名,就取别名-->
            <collection property="orderdetails" ofType="com.example.data.Orderdetail">
                <id column="orderdetail_id" property="id"></id>
                <result column="items_id" property="itemsId"></result>
                <result column="items_no" property="itemsNo"></result>
                <result column="orders_id" property="ordersId"></result>
                <!--商品信息-->
                <!--一个订单明细对应一个商品信息,,使用association 一对一映射
                    column:取得是数据库的列名,如果给数据库列名定义了别名,就取别名-->
                <association property="items" javaType="com.example.data.Items">
                    <id column="items_id" property="id"></id>
                    <result column="items_name" property="name"></result>
                    <result column="items_price" property="price"></result>
                </association>
            </collection>
        </collection>
    </resultMap>
    <select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
        SELECT
        orders.*,
        user.username,
        user.sex,
        orderdetail.id orderdetail_id,
        orderdetail.items_id,
        orderdetail.items_no,
        orderdetail.orders_id,
        items.name items_name,
        items.price items_price
        FROM
        orders,
        user,
        orderdetail,
        items
        WHERE orders.user_id=user.id AND orders.id = orderdetail.orders_id AND orderdetail.items_id=items.id
    </select>

3.编写Mapper.java:

    //多对多查询:查询用户购买的商品的所有信息
    public List<User> findUserAndItemsResultMap()throws Exception;

输出结果日志:

Mybatis之高级映射【多对多映射】_数据库
总结:
根据上面业务分析,分析表跟表之间的对应关系。一对多关系,就使用collection,一对一关系,就使用association。一层层嵌套,association放在最底层。
实际上多对多的查询是把所有关联的表的信息都查询出来,放到pojo中的对应的List或者某个类中。所以只查询用户信息表User,就会得到要查询的信息,因为这个用户里包含了那些信息。