- 在实际的业务中,老师一般都会有多个学生,也就是一个Teather对应多个Student,我们在Teather类里面Student一般也是以一个实体类来表示
- 那么返回的Student类不是单一的数据集,而是Student的对象集合,那么association返回单一对象数据集将不适合用于关联数据。
因此使用<collection>将得到的Student对象结果集映射到Teather对象中的类型为student对象的List中
- 数据库中有两张表,teacher表中有id,name两个字段。
student表中有id,name,tid三个字段,其中两表主键均为id,且tid为外键
- <collection>用于对象之间的映射
Teather实体类属性定义:
private int id;
private String name;
//一个学生对象关联多个老师对象
private List<Student> student;
使用<collection>关联表数据
- 外部的结果映射
如果你需要重用resultMap的话,你需要将结果映射合到另一个描述的resultMap结果映射中
<resultMap id="TeacherAndStudent" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="studentList" ofType="Student" />
</resultMap>
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
<select id="getTeacherAndStudent" parameterType="int" resultMap="TeacherAndStudent">
select s.id sid,s.name sname,t.id tid,t.name tname
from student s,teacher t
where s.tid=t.id
and t.id=#{tid}
</select>
- 内部嵌套结果映射
如果你不需要重用resultMap的话,或者你仅仅引用你所有的结果映射合到一个单独描述的结果映射中
<resultMap id="TeacherAndStudent" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="studentList" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
<select id="getTeacherAndStudent" parameterType="int" resultMap="TeacherAndStudent">
select s.id sid,s.name sname,t.id tid,t.name tname
from student s,teacher t
where s.tid=t.id
and t.id=#{tid}
</select>
- 查询嵌套映射
该方法相比连接查询而言效率更高,同时由于可以自定义select查询,比起连接查询也要更灵活一些
<resultMap id="TeacherAndStudent2" type="Teacher">
<result property="id" column="id"/>
<collection property="studentList" ofType="ArrayList" select="getStudentByTeacherId" column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select *from student where tid=#{id}
</select>
<select id="getTeacherAndStudent2" parameterType="int" resultMap="TeacherAndStudent2">
select * from teacher where id=#{id}
</select>