1. 一對多的關係
在我們的例子中,我們的教師可以教一個或多個的課程,這就意味着教師與課程之間的關係是一對多的。我們可以運用元素<collection>來獲取一對多的關係。
教師的表信息如下:
課程表信息如下:
在上面的表信息中,我們的教師John擁有一門課程,但是我們的教師Ying卻有兩門課程。下面是教師和課程的JavaBean。
-
public class Course
-
{
-
private Integer courseId;
-
private String name;
-
private String description;
-
private Date startDate;
-
private Date endDate;
-
private Integer tutorId;
-
-
}
-
public class Tutor
-
{
-
private Integer tutorId;
-
private String name;
-
private String email;
-
private Address address;
-
private List<Course> courses;
-
/setters & getters
-
}
現在讓我們來看一下如何難過教師的信息來獲取更多的對應的課程信息。我們可以應用<collection>元素來映射多個課程的行的信息。與one-to-one的映射一樣,我們可能應用Nested ResultMap和Nested Select來處理one-to-many。
2. 使用Nested ResultMap
我們可以應用下面的例子,來獲取教師的信息連帶着他所關聯的課程信息。
-
<resultMap type="Course" id="CourseResult">
-
<id column="course_id" property="courseId"/>
-
<result column="name" property="name"/>
-
<result column="description" property="description"/>
-
<result column="start_date" property="startDate"/>
-
<result column="end_date" property="endDate"/>
-
</resultMap>
-
<resultMap type="Tutor" id="TutorResult">
-
<id column="tutor_id" property="tutorId"/>
-
<result column="tutor_name" property="name"/>
-
<result column="email" property="email"/>
-
<collection property="courses" resultMap="CourseResult"/>
-
</resultMap>
-
<select id="findTutorById" parameterType="int"
-
resultMap="TutorResult">
-
SELECT T.TUTOR_ID, T.NAME AS TUTOR_NAME, EMAIL, C.COURSE_ID,
-
C.NAME, DESCRIPTION, START_DATE, END_DATE
-
FROM TUTORS T LEFT OUTER JOIN ADDRESSES A ON T.ADDR_ID=A.ADDR_ID
-
LEFT OUTER JOIN COURSES C ON T.TUTOR_ID=C.TUTOR_ID
-
WHERE T.TUTOR_ID=#{tutorId}
-
</select>
3. 使用 Nested Select
我們可能使用select的查詢,獲取教師的信息關聯他的課程信息。
-
<resultMap type="Course" id="CourseResult">
-
<id column="course_id" property="courseId"/>
-
<result column="name" property="name"/>
-
<result column="description" property="description"/>
-
<result column="start_date" property="startDate"/>
-
<result column="end_date" property="endDate"/>
-
</resultMap>
-
<resultMap type="Tutor" id="TutorResult">
-
<id column="tutor_id" property="tutorId"/>
-
<result column="tutor_name" property="name"/>
-
<result column="email" property="email"/>
-
<association property="address" resultMap="AddressResult"/>
-
<collection property="courses" column="tutor_id"
-
select="findCoursesByTutor"/>
-
</resultMap>
-
<select id="findTutorById" parameterType="int"
-
resultMap="TutorResult">
-
SELECT T.TUTOR_ID, T.NAME AS TUTOR_NAME, EMAIL
-
FROM TUTORS T WHERE T.TUTOR_ID=#{tutorId}
-
</select>
-
<select id="findCoursesByTutor" parameterType="int"
-
resultMap="CourseResult">
-
SELECT * FROM COURSES WHERE TUTOR_ID=#{tutorId}
-
</select>
在這個方法中,這個<association>元素的select有名稱放到了<select>的id中。所以執行上面的語句將會執行兩條SQL語句,一個是findCourseByTutor,另一個是findCourseByTutor.
-
public interface TutorMapper
-
{
-
Tutor findTutorById(int tutorId);
-
}
-
TutorMapper mapper = sqlSession.getMapper(TutorMapper.class);
-
Tutor tutor = mapper.findTutorById(tutorId);
-
System.out.println(tutor);
-
List<Course> courses = tutor.getCourses();
-
for (Course course : courses)
-
{
-
System.out.println(course);
-
}
原文地址:http://blog.csdn.net/owen_william/article/details/51815341