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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值