集合查询(一对多)

Exisi 2021-03-27 07:30:40
Categories: Tags:
  • 在实际的业务中,老师一般都会有多个学生,也就是一个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>