軟件架構(gòu)設(shè)計(jì)實(shí)踐- 基于SSM框架 課件 第11章 多表關(guān)聯(lián)映射_第1頁
軟件架構(gòu)設(shè)計(jì)實(shí)踐- 基于SSM框架 課件 第11章 多表關(guān)聯(lián)映射_第2頁
軟件架構(gòu)設(shè)計(jì)實(shí)踐- 基于SSM框架 課件 第11章 多表關(guān)聯(lián)映射_第3頁
軟件架構(gòu)設(shè)計(jì)實(shí)踐- 基于SSM框架 課件 第11章 多表關(guān)聯(lián)映射_第4頁
軟件架構(gòu)設(shè)計(jì)實(shí)踐- 基于SSM框架 課件 第11章 多表關(guān)聯(lián)映射_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

軟件架構(gòu)設(shè)計(jì)實(shí)戰(zhàn)——基于SSM框架Software

Architecture

Design

Practice

Based

on

SSM

Framework第11章多表關(guān)聯(lián)映射123關(guān)聯(lián)關(guān)系基礎(chǔ)一對一關(guān)聯(lián)操作一對多關(guān)聯(lián)操作4多對多關(guān)聯(lián)操作5使用MyBatis注解關(guān)聯(lián)關(guān)系基礎(chǔ)表與表的關(guān)系主要包括一對一、一對多、多對多等,在數(shù)據(jù)庫建表的時(shí)候,也會通過主鍵與外鍵約束建立表之間的關(guān)聯(lián)關(guān)系。1一對一關(guān)聯(lián)操作在一對一的多表關(guān)聯(lián)操作中,需要在結(jié)果映射resultMap元素中添加association子元素,其配置代碼如下所示。2一對一關(guān)聯(lián)操作association元素提供了一系列屬性用戶維護(hù)數(shù)據(jù)表關(guān)系,如表所示2一對一關(guān)聯(lián)操作接下來以“駕校學(xué)員信息管理系統(tǒng)”中學(xué)員與練車卡之間的一對一關(guān)聯(lián),進(jìn)行相應(yīng)操作的講解。2一對一關(guān)聯(lián)操作1.數(shù)據(jù)準(zhǔn)備在數(shù)據(jù)庫driverschooldb中添加數(shù)據(jù)表t_stu_carcard,用于存儲學(xué)員的練車卡信息,其SQL語句如下所示。2一對一關(guān)聯(lián)操作2.創(chuàng)建POJO類在工程項(xiàng)目ORMdemo1的包c(diǎn)om.hrbust.po中新建實(shí)體類StuCarCard用于學(xué)員卡信息的管理.2一對一關(guān)聯(lián)操作3.創(chuàng)建接口類在工程的com.example.ssm.dao包中新建接口IStuCarCardDao,其中聲明查詢練車卡信息的方法findStuCarCardById,查詢參數(shù)card_id,具體代碼如下所示。2一對一關(guān)聯(lián)操作4.創(chuàng)建映射文件在工程項(xiàng)目的com.example.ssm.mapper包中新建StuCarCardMapper.xml文件,主要定義學(xué)員練車卡信息相關(guān)操作的語句.2一對一關(guān)聯(lián)操作5.創(chuàng)建測試方法并運(yùn)行在MybatisTest測試類中,添加新方法findStuCarCardByCardId,在這里使用前面定義好的工具類MyBatisUtil,并采用getMapper的方式進(jìn)行接口映射,代碼如下所示。2一對一關(guān)聯(lián)操作2/***根據(jù)card_id查詢練車卡信息,并通過一對一關(guān)聯(lián)查詢出學(xué)員信息*/@TestpublicvoidfindStuCarCardByCardId(){//1、通過工具類獲得SqlSession對象SqlSessionsession=MyBatisUtil.getSession();//通過getMapper方法,進(jìn)行接口映射IStuCarCardDaostuCarCardDao=session.getMapper(IStuCarCardDao.class);//調(diào)用接口中的方法,返回查詢結(jié)果StuCarCardstuCarCard=stuCarCardDao.findStuCarCardById(2);//打印查詢結(jié)果System.out.println(stuCarCard);}一對一關(guān)聯(lián)操作在這里采用嵌套結(jié)果的方式,在查詢練車卡信息的時(shí)候,查詢出了學(xué)員的相關(guān)信息,其實(shí)這里也可以采用嵌套查詢的方式,在StuCarCardMapper.xml文件中添加如下代碼。2一對多關(guān)聯(lián)操作單向一對多操作單向多對一操作33.1單向一對多操作與一對一關(guān)聯(lián)關(guān)系相比,在項(xiàng)目開發(fā)中使用更多的是一對多的關(guān)聯(lián)關(guān)系,而且在現(xiàn)實(shí)生活中很多實(shí)體之間的關(guān)聯(lián)也都是一對多的。通常情況下,使用MyBatis來處理一對多關(guān)系的時(shí)候,需要在映射結(jié)果集resultMap元素中添加collection子元素。collection子元素的屬性大部分與association子元素相同,但是它還包含了一個特殊屬性——ofType。ofType屬性與javaType屬性對應(yīng),它用于指定實(shí)體對象中集合類屬性所包含的元素類型。3.1單向一對多操作collection元素的使用也比較簡單,可以采用嵌套查詢和嵌套結(jié)果的方式進(jìn)行,代碼示例如下所示。3.1單向一對多操作

1.數(shù)據(jù)準(zhǔn)備在數(shù)據(jù)庫mybatis中添加數(shù)據(jù)表t_car_coach,用于存儲教練的相關(guān)信息,其SQL語句如下所示。3.1單向一對多操作在本案例中由于教練與學(xué)員之間是一對多的關(guān)聯(lián)關(guān)系,教練是“一”,學(xué)員是“多”,因此要在學(xué)員的數(shù)據(jù)表中添加教練數(shù)據(jù)表的主鍵作為外鍵進(jìn)行約束。給t_student數(shù)據(jù)表添加外鍵的SQL語句如下所示。3.1單向一對多操作2.創(chuàng)建POJO類在包c(diǎn)om.example.ssm.pojo中新建實(shí)體類Coach(教練),其代碼如下所示。3.1單向一對多操作3.創(chuàng)建接口類在工程項(xiàng)目的src目錄下com.example.ssm.dao包中新建接口ICoachDao,聲明根據(jù)教練coach_id查詢教練信息的方法findCoachById,查詢參數(shù)coach_id,具體代碼如下所示。3.1單向一對多操作4.創(chuàng)建映射文件在工程項(xiàng)目的src目錄下的包c(diǎn)om.example.ssm.mapper中新建CoachMapper.xml文件,用于映射教練信息的相關(guān)操作,代碼如下所示。3.1單向一對多操作5.編寫測試方法并運(yùn)行在MybatisTest測試類中,添加新方法findCoachByCoachId,代碼如下所示。3.2單向多對一操作在“駕校學(xué)員信息管理系統(tǒng)”中,學(xué)員與教練之間是多對一的關(guān)聯(lián)關(guān)系,即:多名學(xué)員可以關(guān)聯(lián)一位教練,更嚴(yán)格的講,就是一名學(xué)員只能關(guān)聯(lián)一位教練。所以在一對多的關(guān)聯(lián)關(guān)系中,站在“一”端看是一對多的關(guān)系,但是站在“多”端看,其實(shí)又是一對一的關(guān)系。3.2單向多對一操作在本案例中,從學(xué)員端來看,就是一名學(xué)員只能夠關(guān)聯(lián)一位教練。下面結(jié)合該案例來深入講解多對一單向關(guān)聯(lián)操作的具體步驟。首先,注銷POJO類Coach中的屬性List<Student>stus,取消從教練到學(xué)員的導(dǎo)航性,在POJO類Student添加屬性Coachcoach,增加從學(xué)員到教練的導(dǎo)航性。3.2單向多對一操作然后,在映射文件CoachMapper.xml文件增加查詢教練的方法findCoachByCoachId1,代碼如下所示。3.2單向多對一操作在映射文件StudentMapper.xml文件中,增加查詢學(xué)員信息的方法findStudentAndCoachByStuId,代碼如下所示。3.2單向多對一操作最后在測試類MybatisTest中增加測試方法findStudentAndCoachByStuId,其代碼如下所示。多對多關(guān)聯(lián)操作在實(shí)際項(xiàng)目開發(fā)中,多對多的關(guān)聯(lián)關(guān)系也是非常常見的,以“駕校學(xué)員管理信息系統(tǒng)”為例,就存在學(xué)員與教練車之間的多對多關(guān)系。通常情況下,多對多的關(guān)聯(lián)關(guān)系都轉(zhuǎn)化為一對多的形式進(jìn)行處理,在數(shù)據(jù)庫中需要建立關(guān)聯(lián)表。以學(xué)員與教練車為例,可以這樣理解,站在“學(xué)員”端看,一名學(xué)員可以使用多輛教練車,那么學(xué)員與教練車之間是一對多的對應(yīng)關(guān)系;站在“教練車”端看,一輛教練車可以供多名學(xué)員學(xué)習(xí)使用,那么教練車與學(xué)員之間也是一對多的對應(yīng)關(guān)系。因此,在MyBatis框架的實(shí)現(xiàn)中,就是把多對多的關(guān)聯(lián)關(guān)系轉(zhuǎn)化為兩個一對多的對應(yīng)關(guān)系進(jìn)行處理的。4多對多關(guān)聯(lián)操作1.數(shù)據(jù)準(zhǔn)備在項(xiàng)目數(shù)據(jù)庫mybatis中新建數(shù)據(jù)表t_coachcar,用于存儲教練車信息,SQL語句如下所示。4多對多關(guān)聯(lián)操作向教練車數(shù)據(jù)表中插入3條記錄,以便項(xiàng)目后面的程序測試使用,其SQL語句如下所示。4多對多關(guān)聯(lián)操作建立學(xué)員與教練車之間多對多關(guān)聯(lián)關(guān)系的數(shù)據(jù)表t_coachcar_stu,用于存儲學(xué)員與教練車之間對應(yīng)關(guān)系,其SQL語句如下所示。4多對多關(guān)聯(lián)操作向關(guān)聯(lián)關(guān)系數(shù)據(jù)表t_coachcar_stu中插入數(shù)據(jù),建立學(xué)員與教練車之間的聯(lián)系,共插入6條數(shù)據(jù),其SQL語句如下所示。4多對多關(guān)聯(lián)操作2.創(chuàng)建POJO實(shí)體類在工程項(xiàng)目的src目錄的com.example.ssm.pojo包中,新建實(shí)體類CoachCar,對應(yīng)教練車的相關(guān)信息,代碼如下所示。4多對多關(guān)聯(lián)操作3.創(chuàng)建映射接口在工程項(xiàng)目src目錄com.example.ssm.dao包中,新建接口ICoachCarDao,用于自動實(shí)現(xiàn)映射文件中定義的查詢方法(SQL查詢語句),這里聲明查詢方法findCoachCarById,查詢參數(shù)為car_id,具體代碼如下所示。4多對多關(guān)聯(lián)操作4.創(chuàng)建映射文件在com.example.ssm.mapper包中創(chuàng)建映射文件CoachCarMapper.xml文件,用于定于對教練車對象CoachCar的各種操作,在這里定義根據(jù)car_id查詢教練車信息的SQL語句,其代碼如下所示。4多對多關(guān)聯(lián)操作4多對多關(guān)聯(lián)操作5.編寫測試方法在MybatisTest測試類中,添加方法findCoachCarByCarId,用于根據(jù)car_id查詢教練車信息和關(guān)聯(lián)的學(xué)員信息,代碼如下所示。4課程思政實(shí)體之間多對多的關(guān)聯(lián)關(guān)系,在映射的時(shí)候,能不能不轉(zhuǎn)化為兩個一對多的關(guān)系,而是直接進(jìn)行映射呢?答案其實(shí)可以的,在ORM框架Hibernate中,就采用了<set>元素和<many-to-many>進(jìn)行多對多關(guān)聯(lián)關(guān)系的直接映射,但是這是付出巨大代價(jià)的。而在MyBatis框架中就采用化繁為簡、曲線求解的方式,把多對多的關(guān)聯(lián)關(guān)系轉(zhuǎn)化為了兩個一對多的關(guān)聯(lián)關(guān)系,這樣問題就簡化了,求解就方便了。因此,在生活、學(xué)習(xí)、工作中,要學(xué)會辯證的看待問題,不要一味地追求某一性能,而要綜合考慮,學(xué)會利用最小的代價(jià)去解決問題,同時(shí)在分析問題的時(shí)候,要遵守馬列主義的基本原則,采用唯物辯證法,客觀公正的看待問題、解決問題。使用MyBatis注解在MyBatis框架中,除了XML的映射方式,還支持通過注解實(shí)現(xiàn)POJO對象和數(shù)據(jù)表之間的關(guān)系映射。使用注解的時(shí)候,一般將SQL語句直接寫在接口上。與Spring框架一樣,使用注解的方式比XML的映射方式更加簡潔,能夠減少程序員的代碼量。55.1SQL語句映射注解MyBatis提供的SQL語句映射注解主要為了方便SQL語句的編寫,等同于XML文件中的insert、select、update以及delete元素,減少程序員編寫XML文件的代碼量。下面以“駕校學(xué)員信息管理系統(tǒng)”中學(xué)員信息的管理為例,介紹SQL語句映射注解的使用。5.1SQL語句映射注解1.@Insert注解使用@Insert注解實(shí)現(xiàn)在數(shù)據(jù)表t_student中新增學(xué)員信息的代碼如下所示。@Insert("insertintot_studen(stu_name,age,sex,email)values(#{stuName},#{age},#{sex},#{email})")publicintinsert(Studentstudent);5.1SQL語句映射注解2.@Select注解使用@Select注解查詢數(shù)據(jù)表t_student中所有學(xué)員信息的代碼如下所示。@Select("Select*fromt_student")publicList<Student>queryAllStudent();5.1SQL語句映射注解3.@Update注解使用@Update注解更新數(shù)據(jù)表t_student中學(xué)員信息的代碼如下所示。@Update("updatet_studentsetstu_name=#{stuName},age=#{age},sex=#{sex},email=#{email}wherestu_id=#{stuId}")publicintupdateStudentById(Studentstudent);5.1SQL語句映射注解4.@Delete注解使用@Delete注解刪除數(shù)據(jù)表t_student中一名學(xué)員信息的代碼如下所示。@Delete("deletefromt_studentwherestu_id=#{id}")publicintdeleteStudentById(Integerid);5.1SQL語句映射注解5.@Param注解使用@Param注解可以映射多個查詢參數(shù),例如根據(jù)學(xué)員的性別和年齡查詢學(xué)員信息,其代碼如下所示。@Select("Select*fromt_studentwheresex=#{sex}andage=#{age}")publicList<Student>queryStudentBySexAndAge(@Param(value=”sex”)Stringsex,@Param(”age”)Integerage);5.2結(jié)果集映射注解結(jié)果集映射使用到的主要元素有@Result、@Results、@ResultMap,其中@Results注解主要用來定義一個結(jié)果集映射,與@Result注解配合使用;@ResultMap主要用來引用一個定義好的結(jié)果集映射。這里以查詢所有學(xué)員信息為例,其代碼如下所示。.5.3關(guān)系映射注解1.

@one注解@one注解用于映射實(shí)體之間的一對一關(guān)聯(lián)關(guān)系,例如,在“駕校學(xué)員信息管理系統(tǒng)”中學(xué)員與練車卡之間,根據(jù)練車卡信息能夠關(guān)聯(lián)查詢到學(xué)員信息,其代碼如下所示。.5.3關(guān)系映射注解2.@many注解@ma

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論