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