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

下載本文檔

版權(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第10章單表的CRUD操作123數(shù)據(jù)查詢操作使用insert元素添加數(shù)據(jù)使用delete元素刪除數(shù)據(jù)4使用update元素修改數(shù)據(jù)5使用getMapper和工具類簡(jiǎn)化代碼編寫數(shù)據(jù)查詢操作查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)并交由面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言進(jìn)行處理是數(shù)據(jù)庫(kù)操作中最為常見的操作。在第9章的“第一個(gè)MyBatis應(yīng)用程序”中存在Student對(duì)象的兩個(gè)屬性沒(méi)有封裝成功的問(wèn)題,在本章中將進(jìn)行詳細(xì)講解。11.1結(jié)果映射resultMap所謂結(jié)果映射就是讓數(shù)據(jù)表的字段名稱與Java實(shí)體類的屬性名稱進(jìn)行一一關(guān)聯(lián)匹配的機(jī)制,以便于MyBatis查完數(shù)據(jù)庫(kù)后能夠?qū)㈥P(guān)系數(shù)據(jù)庫(kù)的查詢結(jié)果正確地封裝為Java對(duì)象。1.1結(jié)果映射resultMapresultMap元素是對(duì)象關(guān)系映射文件<mapper>的子元素,主要完成對(duì)象屬性與數(shù)據(jù)表字段之間的關(guān)系對(duì)應(yīng),方便數(shù)據(jù)查詢使用。1.1結(jié)果映射resultMap1.1結(jié)果映射resultMap1.1結(jié)果映射resultMap針對(duì)第9章的“第一個(gè)MyBatis應(yīng)用程序”中Student的屬性stuId和stuName沒(méi)有封裝成功的問(wèn)題,修改StudentMapper.xml文件,在其中加入如下代碼:<!--定義結(jié)果集映射,Student類屬性與數(shù)據(jù)表t_student字段--><resultMapid="studentResultMap"type="com.example.ssm.pojo.Student"><idproperty="stuId"column="stu_id"/><resultproperty="stuName"column="stu_name"/><resultproperty="age"column="age"/><resultproperty="sex"column="sex"/><resultproperty="email"column="email"/></resultMap>1.2使用selectList方法查詢使用selectOne查詢方法,能夠從數(shù)據(jù)庫(kù)中獲取一條數(shù)據(jù)并封裝成為一個(gè)POJO對(duì)象。但是實(shí)際項(xiàng)目開發(fā)中,很多時(shí)候通過(guò)查詢語(yǔ)句返回的是一個(gè)結(jié)果集(二維表),MyBatis框架提供了selectList查詢方法,其完整描述形式有三種:<E>List<E>selectList(Stringstatement)<E>List<E>selectList(Stringstatement,Objectparameter)<E>List<E>selectList(Stringstatement,Objectparameter,RowBoundsrowBounds)1.2使用selectList方法查詢其中,參數(shù)statement是在配置文件中定義的<select.../>元素的id,parameter是查詢所需的參數(shù),通常是對(duì)象或者M(jìn)ap,rowBounds對(duì)象用于分頁(yè),它的兩個(gè)屬性:offset指查詢的當(dāng)前頁(yè)數(shù);limit指當(dāng)前頁(yè)顯示多少條數(shù)據(jù)。返回執(zhí)行SQL語(yǔ)句查詢結(jié)果的泛型對(duì)象的集合。1.2使用selectList方法查詢下面以只包含一個(gè)參數(shù)的selectList方法為例,結(jié)合新的需求“查詢用戶名中含字母‘a(chǎn)’的學(xué)員信息”,進(jìn)一步完善“第一個(gè)MyBatis應(yīng)用程序”。在StudentMapper.xml文件中添加如下代碼。1.3多參數(shù)查詢?cè)凇暗谝粋€(gè)MyBatis應(yīng)用程序”中,使用selectOne方法,傳入了一個(gè)整數(shù)型參數(shù)100,在使用selectList方法中,沒(méi)有傳入?yún)?shù),那么在多條件查詢中,需要傳入多個(gè)參數(shù),該如何處理呢?這就需要使用到查詢方法中的第二參數(shù)Objectparameter,在這里的Object可以使用Map類型,添加多個(gè)鍵-值對(duì),完成多參數(shù)的傳遞。1.3多參數(shù)查詢這里添加新的需求“查詢年齡大于19歲的男學(xué)員”,來(lái)完成多參數(shù)查詢的實(shí)例講解。在StudentMapper.xml文件中添加如下代碼。1.4動(dòng)態(tài)查詢查詢條件的多變性在很多系統(tǒng)中都有所體現(xiàn),例如購(gòu)物網(wǎng)站中的商品篩選,篩選條件有很多,每個(gè)人選的條件也都不一樣,那么最后拼接生成的SQL查詢語(yǔ)句也不相同,在傳統(tǒng)的JDBC或其它類似的開發(fā)框架中,開發(fā)人員通常需要手動(dòng)拼接SQL語(yǔ)句,在拼接時(shí)要確保添加了必要的空格、關(guān)鍵字等,還要注意去掉列表最后一個(gè)列名的逗號(hào)等諸多需要考慮的細(xì)節(jié)問(wèn)題。1.4動(dòng)態(tài)查詢MyBatis提供了強(qiáng)大的動(dòng)態(tài)SQL功能,能夠根據(jù)傳遞的參數(shù)不同,靈活的生成SQL語(yǔ)句,完成不同條件組合的查詢?nèi)蝿?wù)。動(dòng)態(tài)SQL大大減少了編寫代碼的工作量,更體現(xiàn)了MyBatis的靈活性、高度可配置性和可維護(hù)性。1.4動(dòng)態(tài)查詢1.if元素MyBatis框架中提供的if元素類似于Java程序設(shè)計(jì)中的if語(yǔ)句,是MyBatis動(dòng)態(tài)SQL中最常用的判斷語(yǔ)句。使用if元素可以節(jié)省許多拼接SQL的工作,而把主要精力集中在Java代碼的編寫和XML配置文件的維護(hù)上。1.4動(dòng)態(tài)查詢2.where元素在if元素的例子當(dāng)中,讀者不難發(fā)現(xiàn),在where的后面需要手動(dòng)加入“1=1”的子句,原因就是為了避免當(dāng)if查詢條件都不成立時(shí),出現(xiàn)SQL語(yǔ)句錯(cuò)誤的問(wèn)題。其實(shí)在MyBatis中提供了where元素,就是為了避免在多條件判斷的時(shí)候,出現(xiàn)關(guān)鍵字的冗余、缺失等情況。where元素主要用來(lái)簡(jiǎn)化SQL語(yǔ)句中的條件判斷,可以自動(dòng)處理AND/OR條件,語(yǔ)法如下所示。1.4動(dòng)態(tài)查詢3.choose元素與if元素的功能類似,choose元素同樣用于條件判斷,但不同的是choose元素適用于多個(gè)判斷條件的場(chǎng)景,類似于Java程序設(shè)計(jì)中的switch語(yǔ)言。在choose元素中包含when和otherwise兩個(gè)子元素,一個(gè)choose元素中至少包含一個(gè)when子元素,0個(gè)或1個(gè)otherwise子元素,與Java語(yǔ)言中的switch-case-default語(yǔ)句相同,都進(jìn)行“多選一”的條件判斷。當(dāng)應(yīng)用程序中業(yè)務(wù)關(guān)系比較復(fù)雜的時(shí)候,MyBatis可通過(guò)choose元素來(lái)動(dòng)態(tài)控制SQL語(yǔ)言的生成。1.4動(dòng)態(tài)查詢動(dòng)態(tài)語(yǔ)句choose-when-otherwise語(yǔ)法如下所示。1.4動(dòng)態(tài)查詢4.trim元素trim元素用于刪除拼接SQL語(yǔ)句中多余的關(guān)鍵字,它可以直接實(shí)現(xiàn)where元素的功能,在前面的SQL查詢語(yǔ)句中“where1=1”就是為了避免與后面的語(yǔ)句中“and”直接拼接。通過(guò)trim元素能夠在SQL語(yǔ)句拼接的過(guò)程中根據(jù)參數(shù)的傳遞情況自動(dòng)刪除或者增加某些關(guān)鍵字。trim元素包含4個(gè)屬性1.4動(dòng)態(tài)查詢5.foreach元素在前面已經(jīng)介紹了Mybatis框架提供的if、where、trim、choose等元素,來(lái)處理動(dòng)態(tài)查詢語(yǔ)句中的一些簡(jiǎn)單操作。對(duì)于一些SQL查詢語(yǔ)句中含有in條件,需要迭代條件集合來(lái)生成的情況,則可以使用foreach元素來(lái)實(shí)現(xiàn)SQL條件的迭代。1.4動(dòng)態(tài)查詢foreach元素用于循環(huán)語(yǔ)句,它很好的支持了集合操作,如List、Set、Map接口的數(shù)據(jù)集合ArrayList、HashSet、LinkedHashMap等,并對(duì)其提供遍歷的功能,語(yǔ)法格式如下所示。1.4動(dòng)態(tài)查詢foreach元素的各個(gè)屬性具體含義1.4動(dòng)態(tài)查詢6.bind元素在實(shí)際應(yīng)用開發(fā)當(dāng)中,由于不同的數(shù)據(jù)庫(kù)支持的SQL語(yǔ)法略有不同,例如:字符串連接在MySQL數(shù)據(jù)庫(kù)中采用concat函數(shù)、而Oracle數(shù)據(jù)庫(kù)中采用符號(hào)“||”等。如果需要更換數(shù)據(jù)庫(kù),那么程序中的相應(yīng)SQL語(yǔ)句就需要重寫,這就給項(xiàng)目的維護(hù)帶來(lái)了不便性,項(xiàng)目的可移植性也會(huì)大打折扣。此時(shí),可以通過(guò)bind元素來(lái)解決此類數(shù)據(jù)庫(kù)之間的兼容性問(wèn)題。1.4動(dòng)態(tài)查詢bind元素將OGNL表達(dá)式的值綁定到一個(gè)變量中,通過(guò)bind元素對(duì)變量進(jìn)行賦值,屏蔽各種數(shù)據(jù)庫(kù)之間的差異,讓SQL語(yǔ)句的引用變得更加簡(jiǎn)單。bind元素有兩個(gè)屬性。name:給對(duì)應(yīng)參數(shù)取的別名。value:對(duì)應(yīng)傳入實(shí)體類的某個(gè)字段,可以進(jìn)行字符串拼接等特殊處理。使用insert元素添加數(shù)據(jù)在上一節(jié)中介紹了MyBatis提供的各種數(shù)據(jù)查詢操作,在本節(jié)中將介紹insert元素的使用方法,在MyBatis中通過(guò)insert能夠定義插入語(yǔ)句,執(zhí)行數(shù)據(jù)插入操作,其返回值為成功插入數(shù)據(jù)庫(kù)記錄的行數(shù)。21.4動(dòng)態(tài)查詢1.4動(dòng)態(tài)查詢使用insert元素向數(shù)據(jù)表插入數(shù)據(jù)時(shí),一般都需要往數(shù)據(jù)表的多個(gè)字段同時(shí)插入數(shù)據(jù),在這里就需要使用到集合數(shù)據(jù)類型,如Map、List、JavaBean等。在向數(shù)據(jù)表插入數(shù)據(jù)的時(shí)候,數(shù)據(jù)表的主鍵既可以自增長(zhǎng)也可以是非自增長(zhǎng),在使用insert元素的時(shí)候,需要進(jìn)行相應(yīng)的設(shè)置,下面對(duì)這兩種情況進(jìn)行分別進(jìn)行介紹。2.1主鍵由數(shù)據(jù)庫(kù)自增長(zhǎng)在項(xiàng)目開發(fā)中,有很多數(shù)據(jù)庫(kù)都支持?jǐn)?shù)據(jù)表主鍵的自增長(zhǎng),例如MySQL、SQLServer等數(shù)據(jù)庫(kù)表可以采用自動(dòng)遞增的字段作為其主鍵,當(dāng)向這樣的數(shù)據(jù)庫(kù)表插入數(shù)據(jù)時(shí),即使不指定自增主鍵的值,數(shù)據(jù)庫(kù)也會(huì)根據(jù)自增規(guī)則自動(dòng)生成主鍵并插入到表中。2.2主鍵非自增長(zhǎng)在項(xiàng)目開發(fā)中,如果沒(méi)有設(shè)置數(shù)據(jù)表主鍵的自增長(zhǎng),或者數(shù)據(jù)庫(kù)不支持主鍵的自增長(zhǎng)(例如Oracle),就需要在項(xiàng)目開發(fā)中使用insert元素的子元素selectKey,手動(dòng)進(jìn)行主鍵的增長(zhǎng)設(shè)置,selectKey元素的語(yǔ)法格式如下所示。2.2主鍵非自增長(zhǎng)selectKey元素中屬性說(shuō)明如下:keyProperty:用于指定主鍵值對(duì)應(yīng)的POJO類的屬性。resultType:表示SQL查詢語(yǔ)句所返回值的數(shù)據(jù)類型,這是用的Java語(yǔ)言中的數(shù)據(jù)庫(kù)類型,例如:Integer、String等。order:該屬性取值可以為BEFORE或AFTER。BEFORE表示先執(zhí)行selectKey元素內(nèi)的語(yǔ)句,再執(zhí)行插入語(yǔ)句;AFTER表示先執(zhí)行插入語(yǔ)句再執(zhí)行selectKey元素內(nèi)的語(yǔ)句。2.2主鍵非自增長(zhǎng)在上述代碼先通過(guò)selectKey元素,從數(shù)據(jù)表t_student中查詢出stu_id的最大值并加1,作為傳入?yún)?shù)student中stuId的屬性值,然后再生成insert語(yǔ)句,并插入主鍵值。使用delete元素刪除數(shù)據(jù)MyBatis框架用delete元素來(lái)定義delete語(yǔ)句,執(zhí)行刪除操作。當(dāng)MyBatis執(zhí)行完一條刪除語(yǔ)句后,會(huì)返回一個(gè)整數(shù),表示受影響的數(shù)據(jù)庫(kù)記錄的行數(shù)。3使用delete元素刪除數(shù)據(jù)3使用delete元素刪除數(shù)據(jù)在使用delete元素定義刪除語(yǔ)句的時(shí)候,使用屬性parameterType傳入所需參數(shù),可以是基本數(shù)據(jù)類型,也可以是集合類型,例如:List、Set、Map等,也可以是JavaBean。如果是單個(gè)參數(shù),一般采用基本數(shù)據(jù)傳遞參數(shù)即可;如果是多個(gè)參數(shù)但是不超過(guò)5個(gè),一般采用Map的集合類型即可;如果參數(shù)多個(gè)5個(gè),使用Map進(jìn)行參數(shù)傳入,就會(huì)導(dǎo)致程序的可讀性差、代碼難以理解等諸多問(wèn)題,此時(shí)一般采用JavaBean的方式進(jìn)行參數(shù)傳遞。3使用delete元素刪除數(shù)據(jù)這里以“刪除駕校學(xué)員信息管理系統(tǒng)中的email地址含有‘org’、年齡為20歲的男性學(xué)員”為例,采用Map集合類型傳入查詢參數(shù),來(lái)定義SQL語(yǔ)句。在StudentMapper.xml文件中添加刪除數(shù)據(jù)的delete語(yǔ)句deleteStudentByMap,代碼如下所示。3使用update元素修改數(shù)據(jù)MyBatis映射文件通過(guò)update元素定義更新語(yǔ)句,執(zhí)行修改操作。當(dāng)執(zhí)行完update元素定義的更新語(yǔ)句之后,也會(huì)返回一個(gè)整數(shù),表示修改數(shù)據(jù)庫(kù)記錄的行數(shù)。update元素的屬性與delete元素類似、傳遞的參數(shù)的使用方法也是一樣的。4使用update元素修改數(shù)據(jù)這里采用JavaBean的方式進(jìn)行參數(shù)傳遞,完成“修改駕校學(xué)員信息管理系統(tǒng)中的編號(hào)為100的學(xué)員信息,姓名修改為Bob,年齡修改為25,電子郵箱修改為bob@126.com”。在StudentMapper.xml文件中添加修改數(shù)據(jù)的update語(yǔ)句updateStudentByJavaBean,代碼如下所示。4使用update元素修改數(shù)據(jù)采用JavaBean的方式進(jìn)行數(shù)據(jù)傳遞具有較好的靈活性,JavaBean的所有屬性都可以當(dāng)中參數(shù)傳遞到映射文件定義的SQL語(yǔ)句內(nèi),例如上例中updateStudentByJavaBean語(yǔ)句就是用了Student對(duì)象中的4個(gè)參數(shù)(stuId作為條件,其余stuName、age、email作為修改參數(shù))。4使用getMapper和工具類簡(jiǎn)化代碼編寫在MybatisTest測(cè)試類中,讀者不難發(fā)現(xiàn)findStudentById、findStudentByNamea等方法中很多代碼是相同的,主要用來(lái)完成讀取配置文件、構(gòu)建SqlSessionFactory、關(guān)閉SqlSession等操作,根據(jù)代碼復(fù)用原則,可以把這些重復(fù)的代碼提取到一個(gè)公共的類中,建立一個(gè)工具類(MyBatisUtil),由工具類來(lái)完成這些公共的操作。5使用getMapper和工具類簡(jiǎn)化代碼編寫工具類MyBatisUtil的代入如下所示。5使用getMapper和工具類簡(jiǎn)化代碼編寫該工具類幾乎可以應(yīng)用于所有使用MyBatis框架的項(xiàng)目,具有較好的通用性,讀者在項(xiàng)目開發(fā)中可以直接復(fù)用該類,簡(jiǎn)化項(xiàng)目代碼的編寫。5使用getMapper和工具類簡(jiǎn)化代碼編寫在MyBatis框架中,也提供了在DAO層面向接口的編程,在這里只需要定義接口以及接口所對(duì)應(yīng)的映射文件,其實(shí)現(xiàn)類可以由MyBatis框架通過(guò)代理模式自動(dòng)來(lái)生成,進(jìn)一步降低了項(xiàng)目開發(fā)的復(fù)雜度,減少了代碼的編寫。5使用getMapper和工具類簡(jiǎn)化代碼編寫在工程項(xiàng)目中com.example.ssm.dao包中新建一個(gè)接口IStudentDao,聲明一個(gè)查詢方法findStudentById,代碼如下所示。packagecom.example.ssm.dao;importcom.example.ssm.pojo.Student;publicinterfaceIStudentDao{publicStudentfindStudentById(intid);}5使用getMapper和工具類簡(jiǎn)化代碼編寫修改映射文件StudentMapper.xml中namespace命名空間,與接口IStudentDao的完全限定名一致,均為:com.example.ssm.dao.IstudentDao。此時(shí)MyBatis框架就能夠通過(guò)getMapper方法,自動(dòng)生成接口與映射文件的實(shí)現(xiàn)類。5課程思政MyBatis框架的主要作用是對(duì)象與關(guān)系之間的映射,處理的核心就是數(shù)據(jù)轉(zhuǎn)換。在這里數(shù)據(jù)是具體,例如對(duì)象的屬性以及數(shù)據(jù)表的記錄。而數(shù)據(jù)是一切信息技術(shù)的基礎(chǔ),已經(jīng)升級(jí)成為一種重要的生產(chǎn)要素,是一種重要的戰(zhàn)略資源。2023年我國(guó)組建了國(guó)家數(shù)據(jù)局,負(fù)責(zé)協(xié)調(diào)推進(jìn)數(shù)據(jù)基礎(chǔ)制度建設(shè),統(tǒng)籌數(shù)據(jù)資源整合共享和開發(fā)利用,統(tǒng)籌推進(jìn)數(shù)字中國(guó)、數(shù)字經(jīng)濟(jì)、數(shù)字社會(huì)規(guī)劃和建設(shè)等。在大數(shù)據(jù)數(shù)時(shí)代,每個(gè)人都要注意保護(hù)個(gè)人隱私數(shù)據(jù),切勿隨意透露個(gè)人的隱私信息。數(shù)據(jù)安全在國(guó)家安全領(lǐng)域范疇內(nèi)不僅僅體現(xiàn)在軍事安全,實(shí)際上,數(shù)據(jù)已經(jīng)與政治安全、經(jīng)濟(jì)安全、文化安全共同成為國(guó)家安全的重要組成部分。數(shù)據(jù)安全直接影響到國(guó)家安全,在日常生活中,也要提高警惕,恪守國(guó)家秘密,共同維護(hù)國(guó)家安全。6習(xí)題1.請(qǐng)使用工具類MyBatisUtil對(duì)刪除數(shù)據(jù)的方法deleteStuByMap進(jìn)行簡(jiǎn)化。2.在MyBatis框架應(yīng)用中如何實(shí)現(xiàn)動(dòng)態(tài)查詢?3.在DAO層使用getMapper接口映射應(yīng)該注意的事項(xiàng)是什么?4.使用delete元素如何實(shí)現(xiàn)一次刪除多條數(shù)據(jù)?5.在MyBatis框架應(yīng)用中如何實(shí)現(xià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)目開發(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)目開發(fā)中,多對(duì)多的關(guān)聯(lián)關(guā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}")publicintupdateStu

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論