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


一個人對應(yīng)一本護照,同時一本護照對應(yīng)一個人,而且人不一定有護照,有護照一定會有人存在。
因此外鍵應(yīng)設(shè)在護照表中,那么就該創(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;
}
那實際做項目時應(yīng)該如何取舍?答案是根據(jù)需求:
- 如果是查詢公民以及其對應(yīng)的護照信息,那就用前者
- 如果是查詢所有護照以及持有者的信息,那就用后者
- 因此在設(shè)計類時不要太死板,兩種方法需要斟酌后選擇
這里以查詢公民以及其對應(yī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>
重點在于resultMap里的寫法:
association 標(biāo)簽用于一對一關(guān)系:
- propetry 后寫屬性名
- javaType 后寫該屬性所屬類的類型
編寫測試類:
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(打印方法)
運行結(jié)果:

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


用戶可以下多個訂單,一個訂單對應(yīng)一個用戶,這就是一種一對多關(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>
這里與一對一的區(qū)別就在于使用的標(biāo)簽不同:
collection 標(biāo)簽:
- property后寫屬性名
- javaType后寫集合類型
- ofType后寫泛型的類型
測試結(jié)果:

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



一個學(xué)生可以選多個課程,而一個課程可以被多個學(xué)生選擇,這就是典型的多對多關(guān)系。
而 多對多 與 一對多 關(guān)系在xml文件中resultMap的寫法幾乎一致,因此不做過多解釋,看一下sql 語句與測試結(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實現(xiàn)表連接查詢寫法(三種對應(yīng)關(guān)系)的方法總結(jié)的文章就介紹到這了,更多相關(guān)MyBatis表連接查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot遠(yuǎn)程debug調(diào)試全過程
這篇文章主要介紹了springboot遠(yuǎn)程debug調(diào)試全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05

