版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
軟件架構(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ǔ)一對(duì)一關(guān)聯(lián)操作一對(duì)多關(guān)聯(lián)操作4多對(duì)多關(guān)聯(lián)操作5使用MyBatis注解關(guān)聯(lián)關(guān)系基礎(chǔ)表與表的關(guān)系主要包括一對(duì)一、一對(duì)多、多對(duì)多等,在數(shù)據(jù)庫(kù)建表的時(shí)候,也會(huì)通過(guò)主鍵與外鍵約束建立表之間的關(guān)聯(lián)關(guān)系。1一對(duì)一關(guān)聯(lián)操作在一對(duì)一的多表關(guān)聯(lián)操作中,需要在結(jié)果映射resultMap元素中添加association子元素,其配置代碼如下所示。2一對(duì)一關(guān)聯(lián)操作association元素提供了一系列屬性用戶維護(hù)數(shù)據(jù)表關(guān)系,如表所示2一對(duì)一關(guān)聯(lián)操作接下來(lái)以“駕校學(xué)員信息管理系統(tǒng)”中學(xué)員與練車卡之間的一對(duì)一關(guān)聯(lián),進(jìn)行相應(yīng)操作的講解。2一對(duì)一關(guān)聯(lián)操作1.數(shù)據(jù)準(zhǔn)備在數(shù)據(jù)庫(kù)driverschooldb中添加數(shù)據(jù)表t_stu_carcard,用于存儲(chǔ)學(xué)員的練車卡信息,其SQL語(yǔ)句如下所示。2一對(duì)一關(guān)聯(lián)操作2.創(chuàng)建POJO類在工程項(xiàng)目ORMdemo1的包c(diǎn)om.hrbust.po中新建實(shí)體類StuCarCard用于學(xué)員卡信息的管理.2一對(duì)一關(guān)聯(lián)操作3.創(chuàng)建接口類在工程的com.example.ssm.dao包中新建接口IStuCarCardDao,其中聲明查詢練車卡信息的方法findStuCarCardById,查詢參數(shù)card_id,具體代碼如下所示。2一對(duì)一關(guān)聯(lián)操作4.創(chuàng)建映射文件在工程項(xiàng)目的com.example.ssm.mapper包中新建StuCarCardMapper.xml文件,主要定義學(xué)員練車卡信息相關(guān)操作的語(yǔ)句.2一對(duì)一關(guān)聯(lián)操作5.創(chuàng)建測(cè)試方法并運(yùn)行在MybatisTest測(cè)試類中,添加新方法findStuCarCardByCardId,在這里使用前面定義好的工具類MyBatisUtil,并采用getMapper的方式進(jìn)行接口映射,代碼如下所示。2一對(duì)一關(guān)聯(lián)操作2/***根據(jù)card_id查詢練車卡信息,并通過(guò)一對(duì)一關(guān)聯(lián)查詢出學(xué)員信息*/@TestpublicvoidfindStuCarCardByCardId(){//1、通過(guò)工具類獲得SqlSession對(duì)象SqlSessionsession=MyBatisUtil.getSession();//通過(guò)getMapper方法,進(jìn)行接口映射IStuCarCardDaostuCarCardDao=session.getMapper(IStuCarCardDao.class);//調(diào)用接口中的方法,返回查詢結(jié)果StuCarCardstuCarCard=stuCarCardDao.findStuCarCardById(2);//打印查詢結(jié)果System.out.println(stuCarCard);}一對(duì)一關(guān)聯(lián)操作在這里采用嵌套結(jié)果的方式,在查詢練車卡信息的時(shí)候,查詢出了學(xué)員的相關(guān)信息,其實(shí)這里也可以采用嵌套查詢的方式,在StuCarCardMapper.xml文件中添加如下代碼。2一對(duì)多關(guān)聯(lián)操作單向一對(duì)多操作單向多對(duì)一操作33.1單向一對(duì)多操作與一對(duì)一關(guān)聯(lián)關(guān)系相比,在項(xiàng)目開(kāi)發(fā)中使用更多的是一對(duì)多的關(guān)聯(lián)關(guān)系,而且在現(xiàn)實(shí)生活中很多實(shí)體之間的關(guān)聯(lián)也都是一對(duì)多的。通常情況下,使用MyBatis來(lái)處理一對(duì)多關(guān)系的時(shí)候,需要在映射結(jié)果集resultMap元素中添加collection子元素。collection子元素的屬性大部分與association子元素相同,但是它還包含了一個(gè)特殊屬性——ofType。ofType屬性與javaType屬性對(duì)應(yīng),它用于指定實(shí)體對(duì)象中集合類屬性所包含的元素類型。3.1單向一對(duì)多操作collection元素的使用也比較簡(jiǎn)單,可以采用嵌套查詢和嵌套結(jié)果的方式進(jìn)行,代碼示例如下所示。3.1單向一對(duì)多操作
1.數(shù)據(jù)準(zhǔn)備在數(shù)據(jù)庫(kù)mybatis中添加數(shù)據(jù)表t_car_coach,用于存儲(chǔ)教練的相關(guān)信息,其SQL語(yǔ)句如下所示。3.1單向一對(duì)多操作在本案例中由于教練與學(xué)員之間是一對(duì)多的關(guān)聯(lián)關(guān)系,教練是“一”,學(xué)員是“多”,因此要在學(xué)員的數(shù)據(jù)表中添加教練數(shù)據(jù)表的主鍵作為外鍵進(jìn)行約束。給t_student數(shù)據(jù)表添加外鍵的SQL語(yǔ)句如下所示。3.1單向一對(duì)多操作2.創(chuàng)建POJO類在包c(diǎn)om.example.ssm.pojo中新建實(shí)體類Coach(教練),其代碼如下所示。3.1單向一對(duì)多操作3.創(chuàng)建接口類在工程項(xiàng)目的src目錄下com.example.ssm.dao包中新建接口ICoachDao,聲明根據(jù)教練coach_id查詢教練信息的方法findCoachById,查詢參數(shù)coach_id,具體代碼如下所示。3.1單向一對(duì)多操作4.創(chuàng)建映射文件在工程項(xiàng)目的src目錄下的包c(diǎn)om.example.ssm.mapper中新建CoachMapper.xml文件,用于映射教練信息的相關(guān)操作,代碼如下所示。3.1單向一對(duì)多操作5.編寫測(cè)試方法并運(yùn)行在MybatisTest測(cè)試類中,添加新方法findCoachByCoachId,代碼如下所示。3.2單向多對(duì)一操作在“駕校學(xué)員信息管理系統(tǒng)”中,學(xué)員與教練之間是多對(duì)一的關(guān)聯(lián)關(guān)系,即:多名學(xué)員可以關(guān)聯(lián)一位教練,更嚴(yán)格的講,就是一名學(xué)員只能關(guān)聯(lián)一位教練。所以在一對(duì)多的關(guān)聯(lián)關(guān)系中,站在“一”端看是一對(duì)多的關(guān)系,但是站在“多”端看,其實(shí)又是一對(duì)一的關(guān)系。3.2單向多對(duì)一操作在本案例中,從學(xué)員端來(lái)看,就是一名學(xué)員只能夠關(guān)聯(lián)一位教練。下面結(jié)合該案例來(lái)深入講解多對(duì)一單向關(guān)聯(lián)操作的具體步驟。首先,注銷POJO類Coach中的屬性List<Student>stus,取消從教練到學(xué)員的導(dǎo)航性,在POJO類Student添加屬性Coachcoach,增加從學(xué)員到教練的導(dǎo)航性。3.2單向多對(duì)一操作然后,在映射文件CoachMapper.xml文件增加查詢教練的方法findCoachByCoachId1,代碼如下所示。3.2單向多對(duì)一操作在映射文件StudentMapper.xml文件中,增加查詢學(xué)員信息的方法findStudentAndCoachByStuId,代碼如下所示。3.2單向多對(duì)一操作最后在測(cè)試類MybatisTest中增加測(cè)試方法findStudentAndCoachByStuId,其代碼如下所示。多對(duì)多關(guān)聯(lián)操作在實(shí)際項(xiàng)目開(kāi)發(fā)中,多對(duì)多的關(guān)聯(lián)關(guān)系也是非常常見(jiàn)的,以“駕校學(xué)員管理信息系統(tǒng)”為例,就存在學(xué)員與教練車之間的多對(duì)多關(guān)系。通常情況下,多對(duì)多的關(guān)聯(lián)關(guān)系都轉(zhuǎn)化為一對(duì)多的形式進(jìn)行處理,在數(shù)據(jù)庫(kù)中需要建立關(guān)聯(lián)表。以學(xué)員與教練車為例,可以這樣理解,站在“學(xué)員”端看,一名學(xué)員可以使用多輛教練車,那么學(xué)員與教練車之間是一對(duì)多的對(duì)應(yīng)關(guān)系;站在“教練車”端看,一輛教練車可以供多名學(xué)員學(xué)習(xí)使用,那么教練車與學(xué)員之間也是一對(duì)多的對(duì)應(yīng)關(guān)系。因此,在MyBatis框架的實(shí)現(xiàn)中,就是把多對(duì)多的關(guān)聯(lián)關(guān)系轉(zhuǎn)化為兩個(gè)一對(duì)多的對(duì)應(yīng)關(guān)系進(jìn)行處理的。4多對(duì)多關(guān)聯(lián)操作1.數(shù)據(jù)準(zhǔn)備在項(xiàng)目數(shù)據(jù)庫(kù)mybatis中新建數(shù)據(jù)表t_coachcar,用于存儲(chǔ)教練車信息,SQL語(yǔ)句如下所示。4多對(duì)多關(guān)聯(lián)操作向教練車數(shù)據(jù)表中插入3條記錄,以便項(xiàng)目后面的程序測(cè)試使用,其SQL語(yǔ)句如下所示。4多對(duì)多關(guān)聯(lián)操作建立學(xué)員與教練車之間多對(duì)多關(guān)聯(lián)關(guān)系的數(shù)據(jù)表t_coachcar_stu,用于存儲(chǔ)學(xué)員與教練車之間對(duì)應(yīng)關(guān)系,其SQL語(yǔ)句如下所示。4多對(duì)多關(guān)聯(lián)操作向關(guān)聯(lián)關(guān)系數(shù)據(jù)表t_coachcar_stu中插入數(shù)據(jù),建立學(xué)員與教練車之間的聯(lián)系,共插入6條數(shù)據(jù),其SQL語(yǔ)句如下所示。4多對(duì)多關(guān)聯(lián)操作2.創(chuàng)建POJO實(shí)體類在工程項(xiàng)目的src目錄的com.example.ssm.pojo包中,新建實(shí)體類CoachCar,對(duì)應(yīng)教練車的相關(guān)信息,代碼如下所示。4多對(duì)多關(guān)聯(lián)操作3.創(chuàng)建映射接口在工程項(xiàng)目src目錄com.example.ssm.dao包中,新建接口ICoachCarDao,用于自動(dòng)實(shí)現(xiàn)映射文件中定義的查詢方法(SQL查詢語(yǔ)句),這里聲明查詢方法findCoachCarById,查詢參數(shù)為car_id,具體代碼如下所示。4多對(duì)多關(guān)聯(lián)操作4.創(chuàng)建映射文件在com.example.ssm.mapper包中創(chuàng)建映射文件CoachCarMapper.xml文件,用于定于對(duì)教練車對(duì)象CoachCar的各種操作,在這里定義根據(jù)car_id查詢教練車信息的SQL語(yǔ)句,其代碼如下所示。4多對(duì)多關(guān)聯(lián)操作4多對(duì)多關(guān)聯(lián)操作5.編寫測(cè)試方法在MybatisTest測(cè)試類中,添加方法findCoachCarByCarId,用于根據(jù)car_id查詢教練車信息和關(guān)聯(lián)的學(xué)員信息,代碼如下所示。4課程思政實(shí)體之間多對(duì)多的關(guān)聯(lián)關(guān)系,在映射的時(shí)候,能不能不轉(zhuǎn)化為兩個(gè)一對(duì)多的關(guān)系,而是直接進(jìn)行映射呢?答案其實(shí)可以的,在ORM框架Hibernate中,就采用了<set>元素和<many-to-many>進(jìn)行多對(duì)多關(guān)聯(lián)關(guān)系的直接映射,但是這是付出巨大代價(jià)的。而在MyBatis框架中就采用化繁為簡(jiǎn)、曲線求解的方式,把多對(duì)多的關(guān)聯(lián)關(guān)系轉(zhuǎn)化為了兩個(gè)一對(duì)多的關(guān)聯(lián)關(guān)系,這樣問(wèn)題就簡(jiǎn)化了,求解就方便了。因此,在生活、學(xué)習(xí)、工作中,要學(xué)會(huì)辯證的看待問(wèn)題,不要一味地追求某一性能,而要綜合考慮,學(xué)會(huì)利用最小的代價(jià)去解決問(wèn)題,同時(shí)在分析問(wèn)題的時(shí)候,要遵守馬列主義的基本原則,采用唯物辯證法,客觀公正的看待問(wèn)題、解決問(wèn)題。使用MyBatis注解在MyBatis框架中,除了XML的映射方式,還支持通過(guò)注解實(shí)現(xiàn)POJO對(duì)象和數(shù)據(jù)表之間的關(guān)系映射。使用注解的時(shí)候,一般將SQL語(yǔ)句直接寫在接口上。與Spring框架一樣,使用注解的方式比XML的映射方式更加簡(jiǎn)潔,能夠減少程序員的代碼量。55.1SQL語(yǔ)句映射注解MyBatis提供的SQL語(yǔ)句映射注解主要為了方便SQL語(yǔ)句的編寫,等同于XML文件中的insert、select、update以及delete元素,減少程序員編寫XML文件的代碼量。下面以“駕校學(xué)員信息管理系統(tǒng)”中學(xué)員信息的管理為例,介紹SQL語(yǔ)句映射注解的使用。5.1SQL語(yǔ)句映射注解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語(yǔ)句映射注解2.@Select注解使用@Select注解查詢數(shù)據(jù)表t_student中所有學(xué)員信息的代碼如下所示。@Select("Select*fromt_student")publicList<Student>queryAllStudent();5.1SQL語(yǔ)句映射注解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語(yǔ)句映射注解4.@Delete注解使用@Delete注解刪除數(shù)據(jù)表t_student中一名學(xué)員信息的代碼如下所示。@Delete("deletefromt_studentwherestu_id=#{id}")publicintdeleteStudentById(Integerid);5.1SQL語(yǔ)句映射注解5.@Param注解使用@Param注解可以映射多個(gè)查詢參數(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注解主要用來(lái)定義一個(gè)結(jié)果集映射,與@Result注解配合使用;@ResultMap主要用來(lái)引用一個(gè)定義好的結(jié)果集映射。這里以查詢所有學(xué)員信息為例,其代碼如下所示。.5.3關(guān)系映射注解1.
@one注解@one注解用于映射實(shí)體之間的一對(duì)一關(guān)聯(lián)關(guān)系,例如,在“駕校學(xué)員信息管理系統(tǒng)”中學(xué)員與練車卡之間,根據(jù)練車卡信息能夠關(guān)聯(lián)查詢到學(xué)員信息,其代碼如下所示。.5.3關(guān)系映射注解2.@many注解@ma
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)簽約帶貨主播產(chǎn)品試用與評(píng)測(cè)合同3篇
- 2025年度教育科技公司干股分紅與在線教育合作協(xié)議3篇
- 2025年企業(yè)法人變更合同審查與員工權(quán)益保障協(xié)議3篇
- 2025年度金融資產(chǎn)重組收購(gòu)協(xié)議3篇
- 2025年度公對(duì)公交易合同模板:金融衍生品交易合作協(xié)議2篇
- 二零二五年度教育培訓(xùn)機(jī)構(gòu)教師職務(wù)聘任與教育教學(xué)改革合同3篇
- 2025年度會(huì)展兼職工作人員勞務(wù)合同樣本3篇
- 二零二五年度軍事訓(xùn)練基地保密協(xié)議及設(shè)施管理合同2篇
- 二零二五年度物流行業(yè)創(chuàng)新技術(shù)研究承包合同3篇
- 二零二五年度內(nèi)墻膩?zhàn)邮┕づc室內(nèi)環(huán)境檢測(cè)及優(yōu)化合同3篇
- 石油英語(yǔ)詞匯
- 《夜宿山寺》-完整版課件
- 滬教牛津版八年級(jí)上冊(cè)初二英語(yǔ)期末測(cè)試卷(5套)
- 北京市海淀區(qū)2020-2021學(xué)年度第一學(xué)期期末初三物理檢測(cè)試卷及答案
- 《潔凈工程項(xiàng)目定額》(征求意見(jiàn)稿)
- 家庭室內(nèi)裝飾裝修工程保修單
- 小學(xué)語(yǔ)文課堂提問(wèn)有效性策略研究方案
- 物業(yè)上門維修收費(fèi)標(biāo)準(zhǔn)
- ATS技術(shù)交流(新型發(fā)動(dòng)機(jī)智能恒溫節(jié)能冷卻系統(tǒng))100318
- 手術(shù)區(qū)皮膚的消毒和鋪巾ppt課件
- 2022年度培訓(xùn)工作總結(jié)
評(píng)論
0/150
提交評(píng)論