主頁 > 軟體設計 > MyBatis~關聯的嵌套Select查詢和關聯的嵌套結果映射(association元素的使用)、集合的嵌套Select查詢和集合的嵌套結果映射(collection的使用)

MyBatis~關聯的嵌套Select查詢和關聯的嵌套結果映射(association元素的使用)、集合的嵌套Select查詢和集合的嵌套結果映射(collection的使用)

2020-11-01 09:25:23 軟體設計

文章目錄

  • 解決一對多資料問題
    • 關聯的嵌套 Select 查詢
    • 關聯的嵌套結果映射
  • 解決一對多問題
    • 集合的嵌套Select查詢
    • 集合的嵌套結果映射
  • 小結

解決一對多資料問題

  • 在一對多的資料表結構中,比如一個老師教育著很多學生, 對于學生而言, 這就是一個一對多的問題
  • 這個主要解決的就是如果我們的POJO物件的屬性中,有一個是參考型別,不是基本型別或者String, 那么簡單的sql陳述句肯定是解決不了的
  • 學生型別
public class Student {

    private int id;
    private String name;
    private Teacher teacher;
}
  • 老師型別
public class Teacher {

    private int id;
    private String name;
}
  • 比如我們現在有一個需求, 要查找資料庫中所有的學生物件, 該如何做?

關聯的嵌套 Select 查詢

    <select id="selectStudent" resultMap="studentTeacher">
        select * from student;
    </select>

    <resultMap id="studentTeacher" type="student">
        <association property="teacher" javaType="teacher" column="tid" select="selectOneTeacher"/>
    </resultMap>

    <select id="selectOneTeacher" resultType="teacher">
        select * from teacher where id=#{tid};
    </select>
  • 帶你解讀一下上面的代碼, 首先id對應的是我們dao層介面的方法 ,回傳值型別我們初始設定成resultmap, 首先查到的是資料庫學生表的所有資訊
  • 然后到resultMap標簽里, 這里的id要對應上述我們設定的resultMap的名子, 這個這個回傳型別就是真實的回傳型別, 所以是student, 其中student的id和name已經自動映射好了, 不需要我們再次建立映射關系, 最重要的就是teacher物件的映射, 我們使用association標簽,property映射到student型別的teacher參考名, Javatype表示回傳的是一個teacher型別, column表示所查到的學生資訊中的tid要去這個老師物件建立連接, select表示呼叫下面的select陳述句
  • 在最下面的select陳述句中,回傳型別是teacher型別與上面進行對應, 在sql陳述句中通過上面的column設定的列的值進行對應建立連接
  • 最后就是回傳student這個物件
    在這里插入圖片描述

關聯的嵌套結果映射

    <select id="selectStudent2" resultMap="studentTeacher2">
        select s.id sid, s.name sname, t.name tname from student s, teacher t where s.tid=t.id;
    </select>

    <resultMap id="studentTeacher2" type="student">
        <result column="sid" property="id"/>
        <result column="sname" property="name"/>
        <association property="teacher" javaType="teacher">
            <result column="tname" property="name"/>
        </association>
    </resultMap>
  • 使用這個代碼易懂, 但是sql陳述句會變得復雜
  • 一開始我們便使用很長的sql陳述句建立老師和學生的連接將所有資訊查詢出來
  • 所以在resultmap中我們只需要將這些資訊進行結果映射即可, 但是要注意參考型別的結果映射還得在association元素內使用, 還需指定回傳的型別
  • 注意我沒有設定老師id的這個屬性的映射關系, 所以查到顯示的肯定是這個資料型別的默認值
    在這里插入圖片描述

解決一對多問題

  • 還是最開始的那個例子, 一個老師教育很多學生, 對于老師而言這就是一對多的關系, 但是在這里我想復雜一下就是一個班級既有老師,又有學生, 也就是既有參考型別, 又有集合型別, 這種該如何查詢
  • 好, 我現在有一個需求 ,我指定老師的id 要得到這個教室的所有資訊, 包括老師的資訊和所有學生的資訊
  • 教室型別
public class ClassRoom {

    private Teacher teacher;
    private List<Student> students;
}

集合的嵌套Select查詢

    <select id="getClassRoom" parameterType="_int" resultMap="classRoomMap">
        select * from teacher where id=#{tid};
    </select>

    <resultMap id="classRoomMap" type="classRoom">
        <association property="teacher" javaType="teacher">
            <result column="id" property="id"/>
            <result column="name" property="name"/>
        </association>
        <collection property="students" javaType="ArrayList" ofType="student" column="id" select="students"/>
    </resultMap>

    <select id="students" resultType="student">
        select id, name from student where tid=#{id};
    </select>
  • 首先最開始id物件方法名是getClassRoom, 通過老師的id查找, 所以會有一個引數parameterType是int型的, 初步回傳型別是resultmap, 在初步的sql陳述句中,我通過老師的id找到這個老師的所有資訊
  • 在resultMap的對應名稱classRoomMap里, 我指定回傳型別當然是一個classroom型別, 接下來就是使用association元素對老師這個參考進行屬性建立映射關系
  • 接下來使用collection這個元素對學生這個集合進行構造, 首先明確使用collection這個元素, 你首先是要與classroom的屬性名建立映射練習, 然后必須指定javatype和oftype, javatype是java中的什么集合型別, oftype是指定這個集合型別中的泛型引數的什么型別的,這個很重要, 然后column指定通過什么資料與后面的select建立聯系
  • 在最后的select中, 我們通過上述column傳來的teacher的id與所有學生的替代建立聯系, 查到對應要求的資訊, 回傳student型別, 值此再回傳classRoom這個型別的查詢結果

在這里插入圖片描述

集合的嵌套結果映射

  • 這里需要改一個東西, 就是如果要滿足我們的需求, 使用上面的classroom型別如果使用集合的嵌套結果映射在SQL層面是實作不了的, 所以得把classroom的資料型別改一下
  • 新的教室型別
public class ClassRoom {

    private int tid;
    private String tname;
    private List<Student> students;
}
  • ok
    <select id="getClassRoom2" parameterType="_int" resultMap="classRoomMap2">
        select s.id sid, s.name sname, t.id tid, t.name tname from student s, teacher t where s.tid=t.id and t.id=#{tid};
    </select>

    <resultMap id="classRoomMap2" type="classRoom">
            <result column="tid" property="tid"/>
            <result column="tname" property="tname"/>
        <collection property="students" javaType="ArrayList" ofType="student">
            <result column="sid" property="id"/>
            <result column="sname" property="name"/>
        </collection>
    </resultMap>
  • 只要使用的是結果集的映射, 就是一開始就將所有資訊都查出來, 然后在一個resultMap中進行屬性名與資料庫表中列的欄位名建立連接
  • 但是還是要注意這里的sql陳述句是比上面的復雜的, 而且要留意只要使用collection元素, 就必須設定其中的Javatype和oftype, 這點很重要
    在這里插入圖片描述

小結

  1. 關聯association, 用于屬性中有物件時使用, 用于一對多的環境
  2. 集合collection, 用于屬性中有集合型別的時候使用,用于多對一的環境
  3. javatype, 用來指定java中指定物體屬性中的型別, 就好比這個指定的是List型別
  4. oftype, 用來指定映射到java指定物體屬性集合中泛型的具體型別,這個指定的就是List中Studente型別
  5. 如果需要使用參考型別, association, 只需注明屬性名稱, 注明javatype, 然后在里面進行設定值即可
  6. 如果是集合型別,使用collection,注明屬性名稱, 注明javatype型別, 和集合型別里面的泛型型別oftype, 然后在里面result值即可.

注意點:

  1. 保證sql的可讀性, 盡量保證通俗易懂
  2. 注意多對一和一對多中屬性名和欄位名的匹配問題, 多用于日志

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/197898.html

標籤:其他

上一篇:mysql存量表資料碎片與索引碎片優化

下一篇:Springboot 使用easyexcel 實作Excel匯出功能

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more