MyBatis的ResultMaps之一对多关系

来源:互联网 发布:linux卸载oracle11g 编辑:程序博客网 时间:2024/06/14 04:27

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