MyBatis的ResultMaps之一對多關係

1. 一對多的關係

在我們的例子中,我們的教師可以教一個或多個的課程,這就意味着教師與課程之間的關係是一對多的。我們可以運用元素<collection>來獲取一對多的關係。

教師的表信息如下:


課程表信息如下:


在上面的表信息中,我們的教師John擁有一門課程,但是我們的教師Ying卻有兩門課程。下面是教師和課程的JavaBean。

[java] view plain copy
  1. public class Course  
  2. {  
  3. private Integer courseId;  
  4. private String name;  
  5. private String description;  
  6. private Date startDate;  
  7. private Date endDate;  
  8. private Integer tutorId;  
  9. //setters & getters  
  10. }  
  11. public class Tutor  
  12. {  
  13. private Integer tutorId;  
  14. private String name;  
  15. private String email;  
  16. private Address address;  
  17. private List<Course> courses;  
  18. /setters & getters  
  19. }  

現在讓我們來看一下如何難過教師的信息來獲取更多的對應的課程信息。我們可以應用<collection>元素來映射多個課程的行的信息。與one-to-one的映射一樣,我們可能應用Nested ResultMap和Nested Select來處理one-to-many。

2. 使用Nested ResultMap

我們可以應用下面的例子,來獲取教師的信息連帶着他所關聯的課程信息。

[html] view plain copy
  1. <resultMap type="Course" id="CourseResult">  
  2. <id column="course_id" property="courseId"/>  
  3. <result column="name" property="name"/>  
  4. <result column="description" property="description"/>  
  5. <result column="start_date" property="startDate"/>  
  6. <result column="end_date" property="endDate"/>  
  7. </resultMap>  
  8. <resultMap type="Tutor" id="TutorResult">  
  9. <id column="tutor_id" property="tutorId"/>  
  10. <result column="tutor_name" property="name"/>  
  11. <result column="email" property="email"/>  
  12. <collection property="courses" resultMap="CourseResult"/>  
  13. </resultMap>  
  14. <select id="findTutorById" parameterType="int"  
  15. resultMap="TutorResult">  
  16. SELECT T.TUTOR_ID, T.NAME AS TUTOR_NAME, EMAIL, C.COURSE_ID,  
  17. C.NAME, DESCRIPTION, START_DATE, END_DATE  
  18. FROM TUTORS T LEFT OUTER JOIN ADDRESSES A ON T.ADDR_ID=A.ADDR_ID  
  19. LEFT OUTER JOIN COURSES C ON T.TUTOR_ID=C.TUTOR_ID  
  20. WHERE T.TUTOR_ID=#{tutorId}  
  21. </select>  

3. 使用 Nested Select

我們可能使用select的查詢,獲取教師的信息關聯他的課程信息。

[html] view plain copy
  1. <resultMap type="Course" id="CourseResult">  
  2. <id column="course_id" property="courseId"/>  
  3. <result column="name" property="name"/>  
  4. <result column="description" property="description"/>  
  5. <result column="start_date" property="startDate"/>  
  6. <result column="end_date" property="endDate"/>  
  7. </resultMap>  
  8. <resultMap type="Tutor" id="TutorResult">  
  9. <id column="tutor_id" property="tutorId"/>  
  10. <result column="tutor_name" property="name"/>  
  11. <result column="email" property="email"/>  
  12. <association property="address" resultMap="AddressResult"/>  
  13. <collection property="courses" column="tutor_id"  
  14. select="findCoursesByTutor"/>  
  15. </resultMap>  
  16. <select id="findTutorById" parameterType="int"  
  17. resultMap="TutorResult">  
  18. SELECT T.TUTOR_ID, T.NAME AS TUTOR_NAME, EMAIL  
  19. FROM TUTORS T WHERE T.TUTOR_ID=#{tutorId}  
  20. </select>  
  21. <select id="findCoursesByTutor" parameterType="int"  
  22. resultMap="CourseResult">  
  23. SELECT * FROM COURSES WHERE TUTOR_ID=#{tutorId}  
  24. </select>  

在這個方法中,這個<association>元素的select有名稱放到了<select>的id中。所以執行上面的語句將會執行兩條SQL語句,一個是findCourseByTutor,另一個是findCourseByTutor.

[java] view plain copy
  1. public interface TutorMapper  
  2. {  
  3. Tutor findTutorById(int tutorId);  
  4. }  
  5. TutorMapper mapper = sqlSession.getMapper(TutorMapper.class);  
  6. Tutor tutor = mapper.findTutorById(tutorId);  
  7. System.out.println(tutor);  
  8. List<Course> courses = tutor.getCourses();  
  9. for (Course course : courses)  
  10. {  
  11. System.out.println(course);  
  12. }  



原文地址:http://blog.csdn.net/owen_william/article/details/51815341
發佈了37 篇原創文章 · 獲贊 35 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章