要点:
- 多对一:查询的多个对象中有一个属性包含一个复杂对象,使用association标签嵌套
- 一对多:查询的单个对象中的一个属性包含多个其他对象,使用collection标签嵌套
- javaType为实体类中属性的类型,为常用基本数据类型时可以省略
- ofType则是用来指定到List或集合中的实体类类型,泛型中的约束类型
- 按照查询嵌套时,即查询出来后再嵌套,查询语句一般是由两个查询语句组成,类似子查询
- 按照结果嵌套时,即查询时整体嵌套,查询语句一般为联合查询
注意:以下实体类都已使用了别名
1.多对一:使用association
//查询所有学生以及对应老师的信息 List<Student> selectAllStu2(); List<Student> selectAllStu3();
按照查询嵌套:子查询
<!--多对一 按照查询嵌套处理 子查询--> <!--先查询所有学生信息--> <select id="selectAllStu3" resultMap="StudentTeacher2"> select * from student </select> <!--编写映射关系--> <resultMap id="StudentTeacher2" type="student"> <result property="id" column="id"/> <result property="name" column="name"/> <!--复杂属性 查询结果为单个老师对象,所以使用association, 其中property为student类中对应的老师属性字段,select指定子查询语句, 因为子查询中需要一个id的参数,所有使用coumn, 将student查询出的结果字段中的tid传递给子查询语句的id参数 javatype由于老师查询对象返回的是一个老师类实体对象,所以类型为老师类--> <association property="teacher" select="selectAllTea" column="tid" javaType="teacher"/> </resultMap> <!--根据指定id查老师对象--> <select id="selectAllTea" resultType="teacher"> select * from teacher where id=#{tid}; </select>
按照结果嵌套:联合查询
<!--多对一 按照结果嵌套处理 联合查询--> <!--联合查询所有需要的信息--> <select id="selectAllStu2" resultMap="StudentTeacher"> select s.id sid,s.name sname,t.name tname,t.id tid from student s,teacher t where s.tid = t.id </select> <!--编写映射关系--> <resultMap id="StudentTeacher" type="student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <!--查询结果为单个老师对象,所以方法中返回的类型为老师对象, 即javaType为老师对象,然后在对象里编写其对应的老师的映射关系即可--> <association property="teacher" javaType="teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> </association> </resultMap>
2.一对多:使用collection
Teacher selectTeacher(@Param("tid") int id);//查询一个老师的多个学生 Teacher selectTeacher2(@Param("tid") int id);
按照查询嵌套:子查询
<!--一对多 按查询嵌套处理 子查询--> <!--首先根据id查询指定老师的信息--> <select id="selectTeacher2" resultMap="TeacherStudent2"> select * from teacher where id=#{tid}; </select> <!--编写结果集映射--> <resultMap id="TeacherStudent2" type="teacher"> <!--此处由于属性和字段名一致所以下面两行可以省略--> <result property="id" column="id"/> <result property="name" column="name"/> <!--由于查询老师中有一个属性为所有学生对象集合,所一使用collection标签进行嵌套, 方法的返回值是List,所以javaType使用ArrayList来接收,而list中泛型约束类型放的 是student对象所以使用ofType为student来进行映射,使用select进行子查询,并用column 将查询出的id字段传给子查询需要的id--> <!--此处javaType可以省略--> <collection property="student" javaType="ArrayList" ofType="student" select="selectStu" column="id"/> </resultMap> <!--子查询--> <select id="selectStu" resultType="student"> select * from student where tid=#{tid}; </select>
按照结果嵌套:联合查询
<!--一对多 按结果嵌套查询 多表查询--> <!--联合查询所有需要的信息--> <select id="selectTeacher" resultMap="TeacherStudent"> select t.id tid,t.name tname,s.id sid,s.name sname from student s,teacher t where t.id=s.tid and t.id=#{tid}; </select> <!--编写结果集映射--> <resultMap id="TeacherStudent" type="teacher"> <result column="tid" property="id"/> <result column="tname" property="name"/> <!--因为查询的老师实体类字段为studnet,所以属性名为student,查询出的映射对象、 是student类,所以使用ofType指定为student类--> <!--此处加上javaType也能正常运行,进行了省略应该--> <collection property="student" ofType="student"> <result column="sid" property="id"/> <result column="sname" property="name"/> </collection> </resultMap>
-
多对一:查询的多个对象中有一个属性包含一个复杂对象,使用association标签嵌套