日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MyBatis之使用resultMap实现高级映射

發(fā)布時間:2024/8/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis之使用resultMap实现高级映射 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MyBatis之使用resultMap實現(xiàn)高級映射

2017/09/30

對于數(shù)據(jù)庫中對表的增刪改查操作,我們知道增刪改都涉及的是單表,而只有查詢操作既可以設(shè)計到單表操作又可以涉及到多表操作,所以對于輸入映射parameterType而言是沒有所謂的高級映射的,也就是說高級映射只針對于輸出映射(因為高級映射設(shè)計到多張表)。

前五篇文章我們都只實現(xiàn)了單表中的字段與pojo的映射,而本篇文章我們將來講解如何實現(xiàn)多表與pojo之間的高級映射,分別有一對一映射、一對多映射和多對多映射。首先我們來看看如何使用resultType完成一對一映射。

1.多表間的一對一查詢

1.1需求

查詢訂單信息關(guān)聯(lián)查詢用戶信息。這里我們知道一個用戶可以有多張訂單,而一張訂單只能屬于一個用戶,所以用戶與訂單間的關(guān)系是一對多而訂單與用戶間的關(guān)系是一對一。所以這里我們將訂單表作為主查詢表來關(guān)聯(lián)用戶表,從而實現(xiàn)一對一映射。

1.2創(chuàng)建表和數(shù)據(jù)



建立oders表和user表對應的pojo對象Orders.java和User.java。

并建立相關(guān)的get和set方法,User.java我們之前已建立。

1.3sql查詢語句

對于查詢語句,我們需要知道:1.先確定主查詢表:訂單表。2.再確定關(guān)聯(lián)查詢表:用戶信息表。通過orders關(guān)聯(lián)查詢用戶使用user_id一個外鍵,只能關(guān)聯(lián)查詢出一條用戶記錄,我們使用內(nèi)連接。查詢語句為:


1.4使用resultType實現(xiàn)

通過查詢語句,查詢到的結(jié)果同時包括user表和orders表兩張表的列,那么我們將結(jié)果映射到哪個pojo對象中呢?若映射到User.java,那查詢結(jié)果中對應的orders表的字段一定會遺失;若映射到Orders.java,那查詢結(jié)果中對應的user表的字段同樣也會遺失。所以這里需要我們針對查詢的結(jié)果重新創(chuàng)建一個映射的pojo對象OrderCustom.java:





這里我們讓OrderCustom.java繼承自O(shè)rder.java,這樣我們就只需在OrderCustom.java中添加user表中的字段即可。因為MyBatis主要的重點在sql語句,所以我們完成配置和pojo對象的建立后主要的點就放在了sql語句上,所以接下來要定義寫sql語句的mapper.xml和對數(shù)據(jù)庫進行操作的mapper.java接口了.

OrdersMapperCustom.xml文件內(nèi)容如下:


因為我們只關(guān)心輸出映射,所以在xml中寫sql查詢語句時沒有寫parameterType屬性,而resultType的屬性值我之所以沒有寫全OrderCustom類的全限定性名,是因為我們在SqlMapperConfig.xml中進行了別名的配置。相應的OrdersMapperCustom.java接口內(nèi)容如下:


然后在測試類中測試:


便可完成這兩張表的關(guān)聯(lián)與我們自定義的pojo對象的映射。接下來我們看看如何使用resultMap完成。

1.5使用resultMap實現(xiàn)一對一映射

思路:將關(guān)聯(lián)查詢的信息映射到pojo中,如下:只需在Orders類中創(chuàng)建一個User屬性,將關(guān)聯(lián)查詢的信息映射到User屬性中。



這樣我們便可以將查詢的結(jié)果映射到Orders.java類中,而不用自己再自定義一個pojo了。

修改OrdersMapperCustom.xml中的內(nèi)容(添加并使用resultMap標簽),:



然后在OrdersMapperCutom.java中添加方法:



最后測試:

發(fā)現(xiàn)查詢結(jié)果已全部映射到Orders.java類中。

1.6比較resultType和resultMap完成一對一映射

  • resultType:要自定義pojo 保證sql查詢列和pojo的屬性對應,這種方法相對較簡單,所以應用廣泛。
  • resultMap:使用association完成一對一映射需要配置一個resultMap標簽,過程有點復雜,如果要實現(xiàn)延遲加載(后面會講)就只能用resultMap實現(xiàn) ,如果為了方便對關(guān)聯(lián)信息進行解析,也可以用association將關(guān)聯(lián)信息映射到pojo中方便解析。

2.多表間的一對多查詢

2.1需求

查詢所有訂單信息及訂單下的訂單明細信息。分析:一個訂單可以可以有多個訂單明細,而一個訂單明細只屬于一個訂單,所以訂單與訂單明細間的關(guān)系為一對多。

2.2創(chuàng)建表和數(shù)據(jù)


創(chuàng)建和訂單明細表對應的pojo對象:


并創(chuàng)建相關(guān)的set和get方法。

2.3sql查詢語句

1.先確定主查詢表:訂單表。2.再確定關(guān)聯(lián)查詢表:用戶表加訂單明細表。通過orderdetail關(guān)聯(lián)查詢訂單使用orders_id一個外鍵,只能關(guān)聯(lián)查詢出一條訂單記錄,我們使用內(nèi)連接。查詢語句為:


2.4使用resultMap進行一對多映射

思路:resultMap 提供collection完成關(guān)聯(lián)信息映射到集合對象中。在orders類中創(chuàng)建集合屬性:



然后修改OrdersMapperCustom.xml中的信息:


并在其中添加resultMap的定義:


然后在OrdersMapperCutom.java中添加方法:





最后進行測試:




發(fā)現(xiàn)查詢的結(jié)果已全部映射到pojo對象Orders.java的屬性中。

3.多對多查詢(以后我會實現(xiàn)的)

首先我們應該明確的是:一對多是多對多的特例。

需求1:查詢顯示字段:用戶賬號、用戶名稱、用戶性別、商品名稱、商品價格(最常見)
企業(yè)開發(fā)中常見明細列表,用戶購買商品明細列表,
使用resultType將上邊查詢列映射到pojo輸出。

需求2:查詢顯示字段:用戶賬號、用戶名稱、購買商品數(shù)量、商品明細(鼠標移上顯示明細)
使用resultMap將用戶購買的商品明細列表映射到user對象中。

講完如何使用resultMap完成多表間的查詢結(jié)果與pojo對象的高級映射,這里我們還需要補充一個使用resultMap實現(xiàn)延遲加載的知識點。

4.延遲加載

4.1使用延遲加載的意義

在進行數(shù)據(jù)查詢時,為了提高數(shù)據(jù)庫查詢性能,盡量使用單表查詢,因為單表查詢比多表關(guān)聯(lián)查詢速度要快。

如果查詢單表就可以滿足需求,一開始先查詢單表,當需要關(guān)聯(lián)信息時,再關(guān)聯(lián)查詢,當需要關(guān)聯(lián)信息再查詢這個叫延遲加載。

mybatis中resultMap提供延遲加載功能,通過resultMap配置延遲加載,但需要在MyBatis的配置文件中進行相關(guān)配置,如下:

4.2配置mybatis支持延遲加載

設(shè)置項 描述 允許值 默認值
lazyLoadingEnabled 全局性設(shè)置懶加載。如果設(shè)為‘false’,則所有相關(guān)聯(lián)的都會被初始化加載。 true|false false
aggressiveLazyLoading 當設(shè)置為‘true’的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。 true | false true


然后在SqlMapperConfig.xml中添加如下配置信息:





4.3一對一延遲加載的實現(xiàn)

4.3.1實現(xiàn)思路

需求:查詢訂單及用戶的信息,一對一查詢。

剛開始我們只查詢訂單信息。而當需要用戶信息時調(diào)用Orders類中的getUser()方法執(zhí)行延遲加載 ,向數(shù)據(jù)庫發(fā)出sql。代碼實現(xiàn)如下:

在OrderMapperCustom.xml文件中添加如下信息:



并定義resultMap標簽:


然后在OrderMapperCustom.java接口中添加如下方法:




最后是測試代碼:




4.4一對多延遲加載的實現(xiàn)

一對多延遲加載的方法同一對一延遲加載,在collection標簽中配置select內(nèi)容。

5.resultType、resultMap、延遲加載使用場景總結(jié)

延遲加載:
延遲加載實現(xiàn)的方法多種多樣,在只查詢單表就可以滿足需求,為了提高數(shù)據(jù)庫查詢性能使用延遲加載,再查詢關(guān)聯(lián)信息。

mybatis提供延遲加載的功能用于service層。

resultType:作用:將查詢結(jié)果按照sql列名pojo屬性名一致性映射到pojo中。

場合:常見一些明細記錄的展示,將關(guān)聯(lián)查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可。

resultMap:使用association和collection完成一對一和一對多高級映射。

association:作用:將關(guān)聯(lián)查詢信息映射到一個pojo類中。

場合:為了方便獲取關(guān)聯(lián)信息可以使用association將關(guān)聯(lián)訂單映射為pojo,比如:查詢訂單及關(guān)聯(lián)用戶信息。

collection:作用:將關(guān)聯(lián)查詢信息映射到一個list集合中。

場合:為了方便獲取關(guān)聯(lián)信息可以使用collection將關(guān)聯(lián)信息映射到list集合中,比如:查詢用戶權(quán)限范圍模塊和功能,可使用collection將模塊和功能列表映射到list中。






創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的MyBatis之使用resultMap实现高级映射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。