我的技術(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_id | tutor_name | course_id | course_name |
| 1 | 張三 | 1 | 語文 |
| 2 | 李四 | 2 | 數(shù)學(xué) |
讀進(jìn)來的數(shù)據(jù)是,大概是這樣的:
張三 : 語文李四 : 數(shù)學(xué)
如果我們把數(shù)據(jù)改成這樣:
| tutor_id | tutor_name | course_id | course_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_id | tutor_name | course_id | course_name |
| 1 | 張三 | 1 | 語文 |
| 1 | 李四 | 2 | 數(shù)學(xué) |
則讀進(jìn)來的數(shù)據(jù),就會變成這樣了:
張三:語文李四:數(shù)學(xué)
上面這個例子可以說明,如果沒有指定id,會去根據(jù)所有屬性去判斷是否為同一個對象。只要有一個屬性不同,就認(rèn)為不是同一個對象。
如果把數(shù)據(jù)改為:
| tutor_id | tutor_name | course_id | course_name |
| 1 | 張三 | 1 | 語文 |
| 1 | 張三 | 2 | 數(shù)學(xué) |
則讀進(jìn)來的數(shù)據(jù),就會變成:
張三:語文,數(shù)學(xué)
如果所有屬性都相同,就會認(rèn)為是同一個對象了。
寫到這里,發(fā)現(xiàn)思路不太清晰。其實course按照什么去找tutor,主要看的是同一行的tutor,看是這個tutor是不是新的。
新聞熱點(diǎn)
疑難解答