国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

MyBatis用嵌套ResultMap實現(xiàn)一對多映射

2019-11-14 21:05:23
字體:
供稿:網(wǎng)友
MyBatis用嵌套ResultMap實現(xiàn)一對多映射

我的技術(shù)博客經(jīng)常被流氓網(wǎng)站惡意爬取轉(zhuǎn)載。請移步原文:http://m.survivalescaperooms.com/hamhog/p/3959451.html,享受整齊的排版、有效的鏈接、正確的代碼縮進(jìn)、更好的閱讀體驗。

背景

我們知道,MyBatis可以很方便地把SQL select出來的數(shù)據(jù)直接映射為對象的屬性,把對象取出來。

但是,有些對象的屬性是集合類型,集合里保存的是數(shù)個其他類型的對象。如何用MyBatis把它取出來呢?

例子

以以下這個應(yīng)用場景為例:一個教師對應(yīng)多個課程。

數(shù)據(jù)結(jié)構(gòu)如下:

public class Course{    int id;    String name;    }public class Tutor{    int id;    String name;    List<Course> courses;}

這時,就需要分別寫出兩者的ResultMap:

    <resultMap type="Course" id="courseResult">        <result column="course_id" 

然后把select語句的resultMap設(shè)為tutorResult:

<select id="findTutorById" parameterType="int" resultMap="TutorResult">     SELECT TUTOR_ID, TUTOR_NAME, COURSE_ID, COURSE_NAME FROM TUTOR</select>

這樣就能把Tutor類的數(shù)據(jù)正確地讀進(jìn)來了。

實驗

以上這個例子來自《java Persistence with MyBatis3》。讓我好奇的是,myBatis是如何判斷,哪些course應(yīng)該對應(yīng)同一個tutor的呢?對于每個course,它是怎么尋找應(yīng)該把它放進(jìn)哪個tutor的List里呢?

用以上的例子,數(shù)據(jù)為:

tutor_idtutor_namecourse_idcourse_name
1張三1語文
2李四2數(shù)學(xué)

讀進(jìn)來的數(shù)據(jù)是,大概是這樣的:

張三 : 語文李四 : 數(shù)學(xué)

如果我們把數(shù)據(jù)改成這樣:

tutor_idtutor_namecourse_idcourse_name
1張三1語文
1李四2數(shù)學(xué)

讀進(jìn)來的數(shù)據(jù),就會變成這樣:

張三:語文, 數(shù)學(xué)

“李四”沒有了。數(shù)學(xué)歸進(jìn)了張三里。這是為什么呢?

原來,Tutor的ResultMap里,指定了id為tutor_id。一旦指定了id,myBatis就認(rèn)定它是全局唯一的;李四的id與張三相同,因此會被認(rèn)為是同一個對象,則李四的數(shù)據(jù)被直接忽略。

上面這個例子可以說明,如果有指定id,會去根據(jù)id判斷是否為同一個對象。id相同,即使屬性不同,還是認(rèn)為是同一個對象。

而我們?nèi)绻裪d改為普通的result,把Tutor的ResultMap改成這樣:

    <resultMap type="Tutor" id="tutorResult">        <result column="tutor_id" property="id" />        <result column="tutor_name" property="name" />        <collection property="courses" resultMap="Course" />    </resultMap>

此時,仍然用剛才的數(shù)據(jù):

tutor_idtutor_namecourse_idcourse_name
1張三1語文
1李四2數(shù)學(xué)

則讀進(jìn)來的數(shù)據(jù),就會變成這樣了:

張三:語文李四:數(shù)學(xué)

上面這個例子可以說明,如果沒有指定id,會去根據(jù)所有屬性去判斷是否為同一個對象。只要有一個屬性不同,就認(rèn)為不是同一個對象。

如果把數(shù)據(jù)改為:

tutor_idtutor_namecourse_idcourse_name
1張三1語文
1張三2數(shù)學(xué)

則讀進(jìn)來的數(shù)據(jù),就會變成:

張三:語文,數(shù)學(xué)

如果所有屬性都相同,就會認(rèn)為是同一個對象了。

寫到這里,發(fā)現(xiàn)思路不太清晰。其實course按照什么去找tutor,主要看的是同一行的tutor,看是這個tutor是不是新的。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 吴忠市| 高州市| 沿河| 古交市| 冕宁县| 康马县| 江津市| 泉州市| 青川县| 科技| 文化| 大渡口区| 天台县| 安福县| 武陟县| 莒南县| 塘沽区| 白河县| 彭山县| 锡林郭勒盟| 石嘴山市| 潮州市| 商洛市| 体育| 准格尔旗| 名山县| 德格县| 施秉县| 榆林市| 庆安县| 拜城县| 寿阳县| 中宁县| 夏津县| 平利县| 孝义市| 尉氏县| 柳州市| 天全县| 镇平县| 江山市|