1. 程式人生 > >MyBatis的多表查詢

MyBatis的多表查詢

多表設計

  • 一對一 :使用者 購物車
  • 一對多 :使用者 訂單
  • 多對多 :使用者 商品

MyBatis的一對一關係查詢

直接在mysql裡邊操作
  • 新建一張表Student;
    這裡寫圖片描述

  • 再建一張表Cellphone
    這裡寫圖片描述

  • 建立關聯關係
    這裡寫圖片描述

  • 寫sql語句
    這裡寫圖片描述

在idea裡邊怎麼做呢?
新建一個class叫User,裡邊列出Student裡所有的分類,
再建一個class叫Cellphone,裡邊列出Cellphone裡所有的分類,
在User裡邊放置一個Cellphone物件
這樣就完成了兩個表的關聯操作
public class User {
    int id ;
    String name;
    int chinese;
    int english;
    int math;
    Cellphone cellphone;
    ...
}
public class Cellphone {
    int cid ;
    String cname ;
    String cnumber;
    ...
}

問題是如何在Mybatis的前提下進行查詢呢?

  • 第一種方法

新建一個UserExt,讓他繼承User,同時在UserExt中裝入Cellphone中的分類;所以UserExt中的每一個成員都與查詢的結果對應。

public class UserExt  extends User{

    int cid ;
    String cname ;
    String cnumber;
    ...
}
    <select id="queryUserAndCellphone" resultType="com.bamzhy.bean.UserExt">
        SELECT * FROM student LEFT OUTER JOIN cellphone ON student.id = cellphone.sid
    </select>

記得要用ArrayList< UserExt>這樣的陣列裝,因為返回回來的是多個結果

    @Test
    public void test11(){
        ArrayList<UserExt> userExt = dao.queryUserAndCellphone();
        System.out
.println("userext= "+userExt); }
  • 第二種方法
    同時,可以使用ResultMap,把結果對映到一個Map裡邊,並且新建一個POJO儲存Map裡邊的引數。

  • 第三種方法
    直接利用User裡邊的Cellphone引用(比較複雜的方法)

    <resultMap id="usersandCellphone" type="user">
        <id column="id" property="id"></id>
        <result property="name" column="name"/>
        <result property="chinese" column="chinese"/>
        <result property="english" column="english"/>
        <result property="math" column="math"/>

        <!--Map裡邊的名為property的javaType型別引用使用select方法以column作為引數查詢-->
        <association property="cellphone"
                     javaType="com.bamzhy.bean.Cellphone"
                     select="com.bamzhy.dao.UserDao.queryCellphoneBySid"
                     column="id">
            <id column="cid" property="cid"></id>
            <result property="cname" column="cname"/>
            <result property="cnumber" column="cnumber"/>
        </association>
    </resultMap>


    <select id="queryUserAndCellphone2" resultMap="usersandCellphone" >
        select * from student
    </select>

    <select id="queryCellphoneBySid"  parameterType="int" resultType="com.bamzhy.bean.Cellphone">
        select * from cellphone where sid = #{id}
    </select>
  • 流程:
    先去查select * from student,查出來的結果封裝到usersandCellphone,usersandCellphone按照內容進行封裝,發現了一個引用(關聯)物件,再呼叫引用物件的查詢方法(queryCellphoneBySid)再次做一個查詢,然後最後把Map對映到user並返回。

  • 結果:
    User{id=1, name=’haha1’, chinese=90, english=89, math=82, cellphone=Cellphone{ cid=1, cname=’iPhone’, cnumber=’123456’}},等

  • 當封裝物件的列名(屬性)跟該對應POJO的欄位名保持一致的時候,可以把這些屬性都去了

        <association property="cellphone"
                     javaType="com.bamzhy.bean.Cellphone"
                     select="com.bamzhy.dao.UserDao.queryCellphoneBySid"
                     column="id">
            <id column="cid" property="cid"></id>
        </association>

MyBatis的一對多關係查詢

也沒有很複雜,就是一個結果裡邊包含另一個表的很多記錄(關聯主鍵的)

    <resultMap id="userAndCellphones" type="user">
        <id column="id" property="id"></id>
        <result property="name" column="name"/>
        <result property="chinese" column="chinese"/>
        <result property="english" column="english"/>
        <result property="math" column="math"/>
        <collection property="cellphones"
                    javaType="list"
                    select="com.bamzhy.dao.UserDao.queryCellphoneBySid"
                    column="id">
            <id column="cid" property="cid"></id>
        </collection>
    </resultMap>


    <select id="queryUserById"  parameterType="int" resultMap="userAndCellphones" >
        select * from student WHERE  id = #{id}
    </select>

    <select id="queryCellphoneBySid"  parameterType="int" resultType="com.bamzhy.bean.Cellphone">
        select * from cellphone where sid = #{id}
    </select>

MyBatis的多對多關係查詢

  • student類
    這裡寫圖片描述

  • course類
    這裡寫圖片描述

  • t_sc表
    這裡寫圖片描述

    <resultMap id="studentAndCourses" type="com.bamzhy.bean.Student">
        <id column="id" property="id"></id>
        <collection property="courses"
                    javaType="list"
                    select="com.bamzhy.dao.UserDao.findcourseBySid"
                    column="id">
            <id column="cid" property="cid"></id>
        </collection>
    </resultMap>

    <select id="findStudentByID"  parameterType="int" resultMap="studentAndCourses" >
        select * from student WHERE id = #{id}
    </select>

    <select id="findcourseBySid"  parameterType="int" resultType="com.bamzhy.bean.Course">
       select * from t_sc  INNER  JOIN  course on t_sc.cid  =  course.cid  and sid = #{sid}
    </select>
</mapper>
  • sql語句解析:SELECT * FROM t_sc INNER JOIN course ON t_sc.cid = course.cid AND sid = #{id}

在t_sc表中找出cid=course表中cid的選項,並把course中滿足條件的選項全部列出來,最後把這些選項中sid=輸入的id的選項保留下來,給到course。

最後把這些course封裝成student類,給到前臺。

全文最重要的地方來了

  • 一對一
    一個POJO裡邊包含別的類物件的引用;
    Student student;
  • 一對多
    一個POJO裡邊包含別的類物件List的引用
    ArrayList< Student> student;
  • 多對多
    兩個POJO中分別含有對方物件List的引用(要記得toString方法改寫,不然就迴圈呼叫導致溢位)
    ArrayList< Student> studentList;
    ArrayList< Course> courseList;

相關推薦

MyBatis查詢操作——XML(一對

題目:使用Mybatis,使用XML方式查詢表中資料(一對多,在原來單表的基礎上修改) 單表查詢操作連結 一、思路: 思路(實體類+實體類對映檔案+mybatis主配置檔案+測試類): 我們的目標是要通過一條sql語句,把兩張表裡面的資料查詢出來。 第一:改造我們的實體類 1、給

mybatis查詢:一對

思想:設每個員工對應一個部門,而我將員工查詢出來要帶出相應的部門資訊 我的emp表: 我的dept表: 設我有一個部門表的實體類: Dept.java public class Dept { private int deptNo; private String d

mybatis 查詢

mybatis實現多表查詢方式 1.1 業務裝配,對兩個表編寫單表查詢語句,在業務把查詢的兩個結果進行關聯 1.2 使用Auto Mapping 特性,在實現兩表聯合查詢時通過別名完成對映 1.3 使用mybatis的<resultMap>標籤進行實現 2.

03 mybatis查詢一對一,一對,

Account.java   package cn.itcast.domin; public class Account {     private Integer aid;     priv

關於mybatis查詢查詢部分欄位,而丟失一整條資料問題

今天在寫一個list資料按某欄位排序問題時遇到了一個問題,就是有很多個數據這個欄位一樣時,只會查出來一個。 如下 頁面,5條資料只查出來3條資料 基礎資訊和接單什麼資訊的分成了2個表,根據接單數排名 select e.engineer_name,

mybatis 查詢,關聯模型

資料庫的表存在多表的關聯關係。 用的是mysql5.5,ssm框架搭建一個管理系統 我用mybatis-generator生成的pojo和mapper.xml以及mapper等檔案,不會自動幫我建立

Mybatis查詢(一對一、一對)

關聯 表屬性 msn rand tro 對象屬性 reat posit rim Mybatis的多表級聯查詢 。 一對一可以通過實現,一對多和多對多通過實現。 元素,可以靈活選擇屬性column使用哪個字段進行鑒別。 一. 一對一的級聯查詢 對user_t表和book_t

Mybatis查詢之一對一查詢的多種實現-XML配置

        Mybatis 中對於多表查詢提供了非常強大的實現方式,主要是通過resultMap的結果對映對於多表查詢後的返回值進行封裝,讓我們來看一下官網上對於resultMap的解釋:resultMap 元素是 MyBatis 中最重要最強大的元素。它

mybatis查詢關係查詢的實現-xml方式

  Mybatis對於多對多關係下的查詢提供了集合(collection)的概念來解決,collection屬性是resultMap高階結果對映的子集,首先,在本例中我們使用的是集合元素來解決多對多的查詢。 然後你會注意到有一個新的 “ofType” 屬性。這個屬性非常重要,它用來將 JavaBean(或欄位

Mybatis鏈接查詢重復字段問題

spa pac 配置 IT bpmn SQ left join model pack A表和B表一對多的關系 A表 B表 A表和C表也是一對多關系 C表 我現在向查詢出A表的所有字段和B表的name字段,C表的name字段 這是我錯誤的sql語句,可

Java框架-mybatis連線池、動態sql和查詢

1. mybatis連線池 通過SqlMapConfig.xml設定dataSource type實現連線池的配置 1.1 dataSource標籤type屬性值含義 type=”POOLED”: MyBatis 會建立 PooledDataSource 例項

【java專案】mybatis中的mapper查詢時返回其他實體(用於查詢

<select id="selectUserorder" resultType="com.pojo.Orderdetail" parameterType="java.lang.Integer"> SELECT a.o_status, a.o_no, a.uid,

Springboot+mybatis+MySQL實現簡單的查詢

Springboot+mybatis+MySQL實現簡單的多表查詢 直接進入正題 1.首先我們新建一個數據庫,再建兩個表 tbl_employee表建表SQL語句 CREATE TABLE `tbl_employee` ( `id` int(200) NOT NULL AUT

mybatis - 關於查詢 結果的兩種封裝方式(註解版 , xml版)

需求: 一對多查詢,查詢使用者,同時查詢賬號的集合! 案例分析:        1.一個使用者可以有多個賬號 , 也可以沒有賬號.        

mybatis基於xml配置的查詢

mybatis多表查詢 表之間的關係有幾種: 一對多 多對一 一對一 多對多 舉例: 使用者和訂單就是一對多 訂單和使用者就是多對一 一個使用者可以下多個訂單 多個訂單屬於同一個使用者 人和身份證號就是一對一 一個人只能有一個身份證號 一個身份證號只能屬於

mybatis 關聯查詢時,如果使用resultType作為輸出對映時,估計會出現重複資料

mybatis 多表關聯查詢時,一般建議還是使用把需要關聯的表的pojo新增到主表對應的pojo中作為它的屬性,這樣在mapper.xml檔案中可以使用assacition(一對一查詢),或者colletion(一對多查詢)來使用resultMap作為輸出對映。 不過最近我

MyBatis中實現查詢

一、 1、Mybatis是實現多表查詢方式   1.1  業務裝配:對兩個表編寫單表查詢語句,在業務(Service)把查詢的兩表結果合併   1.2  使用Auto Mapping 特性,在實現兩表聯合查詢時通過別名完成對映   1.3  使用MyBatis<re

MyBatis 聯合查詢

最近在做在eclipse + maven搭建SSM框架下做一個簡單的後臺管理系統,因為是第一次搭建SSM專案,在mybatis進行多表連線查詢的時候遇到問題,不知道如何進行處理?在網上搜了一下解決方法是,以實現,記錄下自己的實現方案。 表之間的關係如下圖所示:

SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映和查詢

SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映(多表查詢) 問題情境:比如有張表,使用者和使用者詳情,這兩張表裡面沒長表都有一個id欄位,這兩個表的id欄位都是對應的。 實體類裡面分別對應兩個實體類,user和userdetail,還有一個很重要的實

Java Maven專案:spring boot + Mybatis連線MySQL,通用mapper的增刪改查,對映實現查詢

1. MySQL自帶庫test新增表user、role 角色表role 使用者表user 2. 新增依賴,配置屬性 相關依賴:百度即可,此處略 application.properties spring.application.name=clean-exe