resultMap繼承、嵌套、關聯其他mapper的小demo

一、說明:

前臺分頁展示activity,展示的信息中除了activity的信息,還包括applicant(活動申請人)的部分信息,比如name、mobile等。由於activity表中保存的是applicant表中的id,之前的做法是:即寫一個ActivityDTO類,繼承Activity類,並對ActivityDTO類增加name、mobile等實例變量,這樣做的話,如果之後需要展示更多applicant表中的信息,那麼ActivityDTO類需要持續的增加實例變量,維護起來有一些繁瑣。

因爲Applicant類的存在,所以設想如果使ActivityDTO類繼承activity類,並在ActivityDTO類中增加一個Applicant類變量,那麼就可以減少一些不必要的更改。

二、操作

使用的ssm框架

解決方案集中在mybatis上,讓ActivityDTO能夠在用較少代碼的前提下實現以上設想。

1、首先準備po和DTO類、mapper:

Activity類(對應activity表),如下圖

ActivityDTO類,繼承Activity,並將Applicant設置爲自己的實例變量,如下圖

其實也可以將Activity和Applicant都設置爲ActivityDTO的實例變量,這種情況下,我目前只掌握了在service中進行獲取並設置對象的方法,暫時沒有在mybatis中處理這種情況的方案,所以捨棄了這種做法。

Applicant類(對應applicant表),如下圖

mapper:

ActivityMapper和ApplicantMapper是兩個獨立的mapper,分別處理activity表和applicant表。

ActivityMapper:

如下圖,可以看到ActivityMapper中已經有了Activity類的resultMap

ApplicantMapper:

如下圖,可以看到ApplicantMapper中已經有了Applicant類的resultMap

2、做法

因爲主要展示activity的信息,所以在ActivityMapper中進行操作。

ActivityMapper中增加一個ActivityDTO類的resultMap,如下圖

ActivityMapper中增加一個ActivityDTO類的select語句,如下圖

注意:resultMap對應的是ActivityDTO類的resultMap。

依次說明寫法:

a、處理activity表中的信息
extends="BaseResultMap"

ActivityDTO類繼承了Activity類,ActivityMapper中又有Activity類的resultMap,通過這種寫法,ActivityDTO類的resultMap不需要再書寫Activity類中包含的字段和變量的映射,可以直接將在activity表檢索出的信息賦值給Activity類的resultMap。

b、處理applicant表中的信息

<association property="applicant" column="operator_id" select="com.xxx.dao.ApplicantMapper.selectByPrimaryKey" />

<association>標籤

用來關聯類中的某個實體類的變量,在本文中關聯Applicant類,這裏的並不是基本類型的包裝類,而是自定義的實體類,所以使用<association>,另外,如果使用<result>標籤的話,就無法使用select屬性。

property="applicant"

這個對應的是ActivityDTO類中的Applicant類型的applicant,名稱一定要一致,這個跟<result>標籤是一樣的。

column="operator_id"

這個是作爲參數值傳入到引用的select語句中。這個operator_id來自activity表,應該是在ActivityDTO類的select語句檢索時獲取的。

select="com.xxx.dao.ApplicantMapper.selectByPrimaryKey"

select屬性用來檢索applicant表中信息。因爲出現了跨mapper的情況,所以使用了ActivityMapper的namespace + select的id的形式來引用其他表的檢索語句。ActivityMapper表中的語句不再贅述。

至此,使用junit測試一下該mapper,沒有問題,數據正確。

3、另記

數據正確的情況下,不管是檢索單條還是多條activity表中的信息,applicant表中的信息都可以對應上,這種情況僅限於一對一或多對一的情況,即一條或多條activity對應一條applicant,不能出現一條activity對應多條applicant的情況,如果需要這種情況,ActivityDTO類需要重新修改下,改成List<Applicant>,其實如果一開始就在ActivityDTO類中寫成List<Applicant>,那麼這幾種情況都可以適用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章