MyBatis mapper.xml配置一對多的兩種方式

所需的JavaBean:

public class Course {
    private Integer courseId; 
    private String name; 
    private String description; 
    private Date startDate; 
    private Date endDate; 
    private Integer tutorId;
    //get and set method
    ......
}


public class Tutor {
    private Integer tutorId; 
    private String name; 
    private String email; 
    private Address address; 
    private List<Course> courses;
    //get and set method
    ......
    }

mapper.xml配置
第一種方式:使用內嵌結果 ResultMap
使用標籤:collection

<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 COURSE C ON T.TUTOR_ID=C.TUTOR_ID WHERE T.TUTOR_ID=#{tutorId} 
    </select>  

第二種方式: 使用嵌套 Select 語句
在collection 裏面定義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 type="Tutor" id="TutorResult"> 
      <id column="tutor_id" property="tutorId" /> 
      <result column="tutor_name" property="name" /> 
      <result column="email" property="email" /> 
      <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 COURSE WHERE TUTOR_ID=#{tutorId} 
    </select> 

注:嵌套Select語句查詢會導致N+1選擇問題。首先,主查詢將會執行(1次) ,對於主查詢返回的每一行,另外一個查詢將會被執行(主查詢 N 行,則此查詢 N 次) 。對於大型數據庫而言,這會導致很差的性能問題,不建議使用!

參考自:Java Persistence with MyBatis 3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章