MyBatis實(shí)現(xiàn)表連接查詢寫法(三種對(duì)應(yīng)關(guān)系)的方法總結(jié)
前言
上篇博文把基礎(chǔ)部分記錄了,本篇是對(duì) 表連接查詢 中一對(duì)一,一對(duì)多,多對(duì)多關(guān)系寫法區(qū)別的記錄總結(jié)。
表連接查詢
前提最少是兩張表,其中的子表設(shè)有外鍵
按對(duì)應(yīng)關(guān)系可分為:
- 一對(duì)一
- 一對(duì)多
- 多對(duì)多
對(duì)于主外鍵的關(guān)系搞不清楚的可以參考我以往的博文:mysql一點(diǎn)通
一對(duì)一關(guān)系
有如下兩張表格,t_people(人)與t_passport(護(hù)照):


一個(gè)人對(duì)應(yīng)一本護(hù)照,同時(shí)一本護(hù)照對(duì)應(yīng)一個(gè)人,而且人不一定有護(hù)照,有護(hù)照一定會(huì)有人存在。
因此外鍵應(yīng)設(shè)在護(hù)照表中,那么就該創(chuàng)建類了:
// Passport:
public class Passport {
private Integer passportId;
private String passportSerial;
}
// People
public class People {
private Integer peopleId;
private String peopleName;
private Passport passport;
}
這樣創(chuàng)建非常符合表之間的邏輯關(guān)系,但是創(chuàng)建方式并不唯一。
在Passport類中添加People屬性也是可以的,即:
// Passport
public class Passport {
private Integer passportId;
private String passportSerial;
private People people;
}
// People
public class People {
private Integer peopleId;
private String peopleName;
}
那實(shí)際做項(xiàng)目時(shí)應(yīng)該如何取舍?答案是根據(jù)需求:
- 如果是查詢公民以及其對(duì)應(yīng)的護(hù)照信息,那就用前者
- 如果是查詢所有護(hù)照以及持有者的信息,那就用后者
- 因此在設(shè)計(jì)類時(shí)不要太死板,兩種方法需要斟酌后選擇
這里以查詢公民以及其對(duì)應(yīng)的護(hù)照信息為例,編寫項(xiàng)目:
在mapper接口定義方法:
public interface PeopleMapper {
List<People> selectAll();
}
在xml中編寫sql:
<mapper namespace="com.qj.mapper.PeopleMapper">
<resultMap id="peopleMap" type="People">
<id property="peopleId" column="people_id"/>
<result property="peopleName" column="people_name"/>
<association property="passport" javaType="Passport">
<id property="passportId" column="passport_id"/>
<result property="passportSerial" column="passport_serial"/>
</association>
</resultMap>
<select id="selectAll" resultMap="peopleMap">
select *
from t_people t1
left join t_passport t2 on t1.people_id = t2.people_id
</select>
</mapper>
重點(diǎn)在于resultMap里的寫法:
association 標(biāo)簽用于一對(duì)一關(guān)系:
- propetry 后寫屬性名
- javaType 后寫該屬性所屬類的類型
編寫測(cè)試類:
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
PeopleMapper mapper = sqlSession.getMapper(PeopleMapper.class);
mapper.selectAll().forEach(System.out::println);
MybatisUtil.closeSqlSession(sqlSession);
}
這段代碼:mapper.selectAll().forEach(System.out::println); 中的寫法是在JDK1.8之后有的:
格式:集合.foreach(打印方法)
運(yùn)行結(jié)果:

一對(duì)多關(guān)系
有如下兩張表格,t_user(用戶),t_order(訂單):


用戶可以下多個(gè)訂單,一個(gè)訂單對(duì)應(yīng)一個(gè)用戶,這就是一種一對(duì)多關(guān)系。
查詢用戶及其所有訂單信息:
// Order
public class Order {
private Integer orderId;
private String orderName;
}
// User
public class User {
private Integer uId;
private String userName;
private String userPwd;
private List<Order> orders;
}
xml文件的寫法:
<mapper namespace="com.qj.mapper.UserMapper">
<resultMap id="userMap" type="User">
<id property="uId" column="u_id"/>
<result property="userName" column="u_username"/>
<result property="userPwd" column="u_pwd"/>
<collection property="orders" javaType="java.util.List" ofType="Order">
<id property="orderId" column="order_id"/>
<result property="orderName" column="order_name"/>
</collection>
</resultMap>
<select id="selectAll" resultMap="userMap">
select *
from t_user t1
left join t_order t2
on t1.u_id = t2.user_id
</select>
</mapper>
這里與一對(duì)一的區(qū)別就在于使用的標(biāo)簽不同:
collection 標(biāo)簽:
- property后寫屬性名
- javaType后寫集合類型
- ofType后寫泛型的類型
測(cè)試結(jié)果:

多對(duì)多關(guān)系
有以下三張表格,表示了學(xué)生的選課情況:



一個(gè)學(xué)生可以選多個(gè)課程,而一個(gè)課程可以被多個(gè)學(xué)生選擇,這就是典型的多對(duì)多關(guān)系。
而 多對(duì)多 與 一對(duì)多 關(guān)系在xml文件中resultMap的寫法幾乎一致,因此不做過多解釋,看一下sql 語句與測(cè)試結(jié)果即可:
<select id="selectAll" resultMap="stuMap">
select *
from t_stu t1
left join t_sc t2 on t1.stu_id = t2.s_id
left join t_course t3 on t3.course_id = t2.c_id
</select>
到此這篇關(guān)于MyBatis實(shí)現(xiàn)表連接查詢寫法(三種對(duì)應(yīng)關(guān)系)的方法總結(jié)的文章就介紹到這了,更多相關(guān)MyBatis表連接查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何基于java隨機(jī)獲取不重復(fù)數(shù)值
這篇文章主要介紹了如何基于java隨機(jī)獲取不重復(fù)數(shù)值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Spring如何基于aop實(shí)現(xiàn)操作日志功能
這篇文章主要介紹了Spring如何基于aop實(shí)現(xiàn)操作日志功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
springboot遠(yuǎn)程debug調(diào)試全過程
這篇文章主要介紹了springboot遠(yuǎn)程debug調(diào)試全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05

