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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...