20 - Mybatis學習(5)-數據庫表的關係

1 關聯查詢

1.1 用戶訂單案例

在這裏插入圖片描述

  • user和orders:
    User 與orders:一個用戶可以創建多個訂單,一對多
    Orders 與 user:多個訂單隻由一個用戶創建,多對一
  • orders和orderdetail:
    Orders 與 orderdetail:一個訂單可以包括 多個訂單明細,因爲一個訂單可以購買多個商品,每個商品的購買信息在orderdetail記錄,一對多關係
    orderdetail 與orders:多個訂單明細包括在一個訂單中, 多對一
  • orderdetail和items:
    Orderdetail 與 items:多個訂單明細只對應一個商品信息,多對一
    Items 與 orderdetail:一個商品可以包括在多個訂單明細 ,一對多

  • 查找某個訂單 id 的信息

1.2 一對一

1.2.1 resultType實現

複雜查詢時,單表對應的po類已不能滿足輸出結果集的映射。所以要根據需求建立一個擴展類來作爲resultType的類型。

# 一對一
SELECT o.*, u.username,u.address FROM orders o,user u
WHERE o.user_id = u.id AND o.id=3;

在這裏插入圖片描述


  1. 訂單擴展類
  • 訂單類
    在這裏插入圖片描述

  • 訂單擴展類

package com.tzb.model;

public class OrdersExt extends Orders {
    private String username;
    private String address;

    public String getUsername() {
        return username;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "OrdersExt{" +
                "username='" + username + '\'' +
                ", address='" + address + '\'' +
                '}' + super.toString();
    }
}


  1. 訂單接口
package com.tzb.mapper;

import com.tzb.model.OrdersExt;

public interface OrderMapper {

    public OrdersExt findOrderById(int id);
}


  1. 訂單配置
    在這裏插入圖片描述
  • mybatis配置文件
    在這裏插入圖片描述

  1. 測試
public class Demo5 {

    private SqlSession session;

    @Before
    public void before() throws IOException {
        System.out.println("before.......獲取 session");
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        session = factory.openSession();
    }

    @After
    public void after() {
        System.out.println("after.......關閉 session");
        session.close();
    }

    @Test
    public void test1() throws IOException {
        // 代理
        OrderMapper mapper = session.getMapper(OrderMapper.class);

        OrdersExt ordersExt = mapper.findOrderById(3);

        System.out.println(ordersExt);

    }

}

在這裏插入圖片描述

1.2.2 一對一 resultMap實現

  • 模型裏有模型
    在這裏插入圖片描述
    在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述


  • OrderMapper.xml
<!--模型裏有模型,使用 resultMap-->
    <resultMap id="orderRslMap" type="orders">
        <!--order模型匹配數據-->
        <id column="id" property="id"></id>
        <id column="note" property="note"></id>
        <id column="number" property="number"></id>
        <id column="createtime" property="createtime"></id>

        <!--order 的 user 匹配數據-->
        <association property="user" javaType="user">
            <id column="user_id" property="id"></id>
            <id column="username" property="username"></id>
            <id column="address" property="address"></id>
        </association>
    </resultMap>
    <select id="findOrderById2" parameterType="int" resultMap="orderRslMap">
        SELECT
            o.*, u.username,u.address
         FROM
             orders o,user u
        WHERE
            o.user_id = u.id
        AND o.id = #{id};
    </select>


  • 測試
 @Test
    public void test1() throws IOException {
        // 代理
        OrderMapper mapper = session.getMapper(OrderMapper.class);

        Orders orders = mapper.findOrderById2(3);

        System.out.println(orders);
        System.out.println(orders.getUser());

    }

在這裏插入圖片描述

1.3 一對多

根據定單ID查找定單信息、用戶信息和定單明細信息

在這裏插入圖片描述
在這裏插入圖片描述


  • 訂單詳情模型 OrderDetail.java

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

  • OrderMapper.xml
 <!--一對多-->
    <resultMap id="orderRslMap3" type="orders">
        <!--order模型匹配數據-->
        <id column="id" property="id"></id>
        <id column="note" property="note"></id>
        <id column="number" property="number"></id>
        <id column="createtime" property="createtime"></id>

        <!--order 的 user 匹配數據-->
        <association property="user" javaType="user">
            <id column="user_id" property="id"></id>
            <id column="username" property="username"></id>
            <id column="address" property="address"></id>
        </association>

        <!--往 orders 的orderdetails匹配數據-->
        <collection property="orderDetails" ofType="orderDetail">
            <id column="detail_id" property="id"></id>
            <id column="items_id" property="itemsId"></id>
            <id column="items_num" property="itemsNum"></id>
        </collection>

    </resultMap>
    <select id="findOrderById3" parameterType="int" resultMap="orderRslMap3">
        SELECT
	        o.*,
	        u.username,
	        u.address,
	        od.id detail_id,
	        od.items_id,
	        od.items_num
        FROM
	        orders o,
	        user u,
	        orderdetail od
        WHERE
	        o.user_id = u.id
	    AND o.id = od.orders_id
	    AND o.id = #{id};
    </select>

  • 測試
 @Test
    public void test1() throws IOException {
        // 代理
        OrderMapper mapper = session.getMapper(OrderMapper.class);

        Orders orders = mapper.findOrderById3(3);

        System.out.println(orders);
        System.out.println(orders.getUser());
        System.out.println(orders.getOrderDetails());

    }

在這裏插入圖片描述

1.4 多對多

查詢用戶信息及用戶購買的商品信息,要求將關聯信息映射到主pojo的pojo屬性中

SELECT 
	u.id,
	u.username,
	u.address,
	o.id order_id,
	o.number,
	o.createtime,
	o.note,
	od.id detail_id,
	od.items_id,
	od.items_num,
	it.name,
	it.price,
	it.detail
FROM 
		user u,
	  orders o,
	  orderdetail od,
		items it
WHERE 
	o.user_id = u.id
	AND o.id = od.orders_id
	AND od.items_id = it.id;

在這裏插入圖片描述


在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


  • UserMapper.xml
 <resultMap id="userRsMap" type="user">
        <!--user屬性匹配-->
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="address" property="address"></result>

        <!--匹配 user 的 orderList-->
        <!--一對多,collection-->
        <collection property="orderList" ofType="orders">
            <id column="order_id" property="id"></id>
            <result column="number" property="number"></result>
            <result column="createtime" property="createtime"></result>
            <result column="note" property="note"></result>

            <!--匹配 Orders 裏有 orderDetails -->
            <collection property="orderDetails" ofType="orderDetail">
                <id column="detail_id" property="id"></id>
                <result column="items_id" property="itemsId"></result>
                <result column="items_num" property="itemsNum"></result>

                <!--配置訂單詳情的商品信息-->
                <association property="items" javaType="items">
                    <id column="items_id" property="id"></id>
                    <result column="name" property="name"></result>
                    <result column="price" property="price"></result>
                    <result column="detail" property="detail"></result>
                </association>
            </collection>
        </collection>

    </resultMap>
    <select id="findUserAndOrderInfo" resultMap="userRsMap">
        SELECT
            u.id,
            u.username,
            u.address,
            o.id order_id,
            o.number,
            o.createtime,
            o.note,
            od.id detail_id,
            od.items_id,
            od.items_num,
            it.name,
            it.price,
            it.detail
        FROM
            user u,
            orders o,
            orderdetail od,
            items it
        WHERE
            o.user_id = u.id
            AND o.id = od.orders_id
            AND od.items_id = it.id;
    </select>
  • 測試類
 @Test
    public void test1() throws IOException {
        // 代理
        UserMapper mapper = session.getMapper(UserMapper.class);

        List<User> users = mapper.findUserAndOrderInfo();
        for (User user : users) {
            System.out.println("用戶信息:" + user);
            for (Orders order : user.getOrderList()) {
                System.out.println("訂單信息:" + order);
                System.out.println("訂單詳情:");
                for (OrderDetail orderDetail : order.getOrderDetails()) {
                    System.out.println(orderDetail + ":" +orderDetail.getItems());
                }
                System.out.println("------------------------");
            }
        }

    }

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章