0051 MyBatis關聯映射--多對多關係

来源:http://www.cnblogs.com/sonng/archive/2017/03/25/6617732.html
-Advertisement-
Play Games

用戶與訂單時一對多關係,再加上商品信息的話,訂單與商品之間就是多對多關係了 sql DROP DATABASE IF EXISTS testdb; USE testdb; / 用戶表,記錄用戶信息;用戶與訂單為一對多關係:一個用戶可擁有多個訂單 / DROP TABLE IF EXISTS ; CR ...


用戶與訂單時一對多關係,再加上商品信息的話,訂單與商品之間就是多對多關係了

DROP DATABASE IF EXISTS testdb;
USE testdb;
/*用戶表,記錄用戶信息;用戶與訂單為一對多關係:一個用戶可擁有多個訂單*/
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE tb_user(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(18),
    loginname VARCHAR(18),
    PASSWORD VARCHAR(18),
    phone VARCHAR(18),
    address VARCHAR(18)
);

INSERT INTO tb_user(username,loginname,PASSWORD,phone,address) VALUES('傑克','jack','123456','13920001616','廣州');

/*商品信息表;商品與訂單為多對多關係:一個訂單可有多個商品,一個商品也可出現在多個訂單中*/
DROP TABLE IF EXISTS `tb_article`;
CREATE TABLE tb_article(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(32),
    price DOUBLE,
    remark VARCHAR(18)
);

INSERT INTO tb_article(NAME,price,remark) VALUES('瘋狂Java講義',108.9,'李剛老師經典著作');
INSERT INTO tb_article(NAME,price,remark) VALUES('瘋狂Android講義',99.9,'李剛老師經典著作');
INSERT INTO tb_article(NAME,price,remark) VALUES('瘋狂iOS講義',89.9,'李剛老師經典著作');
INSERT INTO tb_article(NAME,price,remark) VALUES('SpringMVC+MyBatis企業開發',69.9,'肖文吉老師經典著作');

/*訂單表,記錄訂單編號,總金額,所屬用戶的id;訂單與用戶為多對一關係,與商品為多對多關係*/
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE tb_order(
    id INT PRIMARY KEY AUTO_INCREMENT,
    CODE VARCHAR(32),
    total DOUBLE,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES tb_user(id)
);

INSERT INTO tb_order(CODE,total,user_id) VALUES('6aa3fa359ff14619b77fab5990940a2d',388.6,1);
INSERT INTO tb_order(CODE,total,user_id) VALUES('6aa3fa359ff14619b77fab5990940b3c',217.8,1);

/*中間表,用於記錄訂單對應的商品id*/
DROP TABLE IF EXISTS `tb_item`;
CREATE TABLE tb_item(
    order_id INT,
    article_id INT,
    amount INT,
    PRIMARY KEY(order_id,article_id),
    FOREIGN KEY (order_id) REFERENCES tb_order(id),
    FOREIGN KEY (article_id) REFERENCES tb_article(id)
);

INSERT INTO tb_item(order_id,article_id,amount) VALUES(1,1,1);
INSERT INTO tb_item(order_id,article_id,amount) VALUES(1,2,1);
INSERT INTO tb_item(order_id,article_id,amount) VALUES(1,3,2);
INSERT INTO tb_item(order_id,article_id,amount) VALUES(2,4,2);
INSERT INTO tb_item(order_id,article_id,amount) VALUES(2,1,1);

實體類User

package net.sonng.manytomany;

import java.util.List;

public class User {
    private int id;
    private String username;
    private String loginname;
    private String password;
    private String phone;
    private String address;
    private List<Order> orders; //用戶與訂單:一對多關係,一個用戶可有多個訂單
    //...... 
}

實體類Order

package net.sonng.manytomany;

import java.util.List;

public class Order {
    private int id;
    private String code;
    private double total;
    private int user_id;
    private User user;              //一個訂單隻屬於一個用戶
    private List<Article> articles; //訂單與商品:多對多關係,一個訂單可包含多個商品,一個商品也可以出現在多個訂單中
    //..... 
}

實體類Article

package net.sonng.manytomany;

import java.util.List;

public class Article {
    private int id;
    private String name;
    private double price;
    private String remark;
    private List<Order> orders;  //商品與訂單:多對多關係
    //.....
}

根據用戶id查詢用戶信息,並將其所有訂單信息一併查詢出來

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTDMapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="net.sonng.manytomany.UserDao">
    
    <select id="selectUserById" parameterType="int" resultMap="userMap">
        SELECT * FROM tb_user WHERE id=#{user_id}
    </select>

    <resultMap id="userMap" type="net.sonng.manytomany.User">
        <id property="id" column="id" />
        <result property="username" column="username" />
        <result property="loginname" column="loginname" />
        <result property="password" column="password" />
        <result property="phone" column="phone" />
        <result property="address" column="address" />
        <!-- 用戶與訂單一對多關係,用collection -->
        <collection property="orders" column="id" javaType="ArrayList" ofType="net.sonng.manytomany.Order" select="net.sonng.manytomany.OrderDao.selectOrderByUserId" >
            <id property="id" column="id" />
            <result property="code" column="code" />
            <result property="total" column="total" />
        </collection>
    </resultMap>
    
</mapper>

根據訂單id查詢訂單信息,一併將其所屬的用戶信息和包含的商品信息查詢出來

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTDMapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="net.sonng.manytomany.OrderDao">

    <select id="selectOrderByUserId" parameterType="int" resultType="net.sonng.manytomany.Order" >
        SELECT * FROM tb_order WHERE user_id=#{user_id} 
    </select>

    <select id="selectOrderById" parameterType="int" resultMap="orderMap">
        SELECT u.*,o.id AS oid,code,total,user_id FROM tb_order o,tb_user u WHERE o.user_id=u.id AND o.id=#{order_id}
    </select>
    
    <resultMap type="net.sonng.manytomany.Order" id="orderMap" >
        <id property="id" column="id" />
        <result property="code" column="code" />
        <result property="total" column="total" />
        <association property="user" javaType="net.sonng.manytomany.User">
            <id property="id" column="id" />
            <result property="username" column="username" />
            <result property="loginname" column="loginname" />
            <result property="password" column="password" />
            <result property="phone" column="phone" />
            <result property="address" column="address" />
        </association>
        <collection property="articles" column="id" javaType="ArrayList" ofType="net.sonng.manytomany.Article" select="net.sonng.manytomany.ArticleDao.selectArticleByOrderId" >
            <id property="id" column="id" />
            <result property="name" column="name" />
            <result property="price" column="price" />
            <result property="remark" column="remark" />
        </collection>
    </resultMap>
</mapper>

根據訂單id,先從中間表item中查詢其包含的商品id,再查詢這些商品的信息

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTDMapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="net.sonng.manytomany.ArticleDao">
    
    <select id="selectArticleByOrderId" parameterType="int" resultType="net.sonng.manytomany.Article">
        SELECT * FROM tb_article WHERE id IN (SELECT article_id FROM tb_item WHERE order_id=#{order_id})
    </select>

</mapper>

測試類

package net.sonng.test;

import java.util.List;

import net.sonng.manytomany.Article;
import net.sonng.manytomany.ArticleDao;
import net.sonng.manytomany.Order;
import net.sonng.manytomany.OrderDao;
import net.sonng.manytomany.User;
import net.sonng.manytomany.UserDao;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args){
        ApplicationContext ac=new ClassPathXmlApplicationContext("ac.xml");
        
        System.out.println("測試用戶查詢:根據用戶id查詢用戶信息及其訂單信息");
        UserDao userDao=ac.getBean("userDao",UserDao.class);
        User user=userDao.selectUserById(1);
        System.out.println("------用戶信息------");
        System.out.println(user);
        List<Order> orders=user.getOrders();
        System.out.println("------該用戶下的訂單信息------");
        for (Order order:orders){
            System.out.println(order);
        }
        
        System.out.println("測試訂單查詢:根據訂單id查詢訂單信息,所屬用戶信息,訂單包含的商品信息");
        OrderDao orderDao=ac.getBean("orderDao",OrderDao.class);
        Order order=orderDao.selectOrderById(2);
        System.out.println("------訂單信息------");
        System.out.println(order);
        System.out.println("------訂單所屬用戶信息------");
        System.out.println(order.getUser());
        List<Article> articles=order.getArticles();
        System.out.println("------訂單包含的商品信息------");
        for (Article article:articles) {
            System.out.println(article);
        }
    }
}

輸出:

測試用戶查詢:根據用戶id查詢用戶信息及其訂單信息
------用戶信息------
User [id=1, username=傑克, loginname=jack, password=123456, phone=13920001616, address=廣州]
------該用戶下的訂單信息------
Order [id=1, code=6aa3fa359ff14619b77fab5990940a2d, total=388.6, user_id=1]
Order [id=2, code=6aa3fa359ff14619b77fab5990940b3c, total=217.8, user_id=1]
測試訂單查詢:根據訂單id查詢訂單信息,所屬用戶信息,訂單包含的商品信息
------訂單信息------
Order [id=1, code=6aa3fa359ff14619b77fab5990940b3c, total=217.8, user_id=0]
------訂單所屬用戶信息------
User [id=1, username=傑克, loginname=jack, password=123456, phone=13920001616, address=廣州]
------訂單包含的商品信息------
Article [id=1, name=瘋狂Java講義, price=108.9, remark=李剛老師經典著作]
Article [id=2, name=瘋狂Android講義, price=99.9, remark=李剛老師經典著作]
Article [id=3, name=瘋狂iOS講義, price=89.9, remark=李剛老師經典著作]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 此文章是基於 EasyUI+Knockout實現經典表單的查看、編輯 一. 準備工作 1. 點擊此下載相關文件,並把文件放到 ims 工程對應的文件夾下 二. 相關文件介紹 1. user.jsp:用戶管理界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
  • Apache Thrift 是 Facebook 實現的一種高效的、支持多種編程語言的遠程服務調用的框架。 安裝thrift 從官網下載 然後按照./configure,make,make install 方式進行安裝,其他系統可以參照官網http://thrift.apache.org/docs/ ...
  • 下圖為測試結果: ...
  • 昨天沒有更新,特此來說明下原因,昨天回到家時已經甚晚,正逢公司這幾天項目比較緊張(bug多,趕需求,看著bug單齊刷刷的轉過來,心都顫抖了一下),沒有及時準備素材,今天又加了一天班(現在還在公司,偷個空隙趕緊發博,哈哈哈),所以昨晚沒有更博。 今天在改bug的時候發現瞭如圖的小問題,來分享一下,主要 ...
  • matplotlib實際上是一套面向對象的繪圖庫,它所繪製的圖表中的每個繪圖元素,例如線條Line2D、文字Text、刻度等在記憶體中都有一個對象與之對應。為了方便快速繪圖matplotlib通過pyplot模塊提供了一套和MATLAB類似的繪圖API,將眾多繪圖對象所構成的複雜結構隱藏在這套API內 ...
  • 轉自:http://blog.csdn.net/wushiwude/article/details/55101631 一、前言 dubbo的使用,其實只需要有註冊中心,消費者,提供者這三個就可以使用了,但是並不能看到有哪些消費者和提供者,為了更好的調試,發現問題,解決問題,因此引入dubbo-adm ...
  • 從一開始就讓我們簡化這次的討論。你有兩類你能夠繼承的函數:虛函數和非虛函數。然而,重新定義一個非虛函數總是錯誤的(Item 36),所以我們可以安全的把這個條款的討論限定在繼承帶預設參數值的虛函數上。 1. 虛函數是動態綁定的,而預設參數是靜態綁定的 在這種情況下,這個條款的驗證就相當直接了:虛函數 ...
  • Restful是一種架構style,目前常說的有restful web service, resultful http。現在熱搜榜的微服務,大多數會採用Restful方式。 JAX-RS 作為一個Restful 風格WebService規範,目前已發展到了2.0版本,目前比較常用的兩個版本是JAX- ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...