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