与association一样,collection元素也有两种形式,现介绍如下:
一、嵌套的resultMap

      实际上以前的示例使用的就是这种方法,今天介绍它的另一种写法。还是以教师映射为例,修改映射文件TeacherMapper.xml如下(点击此处进入嵌套resultMap形式的示例源码下载页面。注:本示例代码是在修改本系列的上篇博文示例代码的基础上完成的,用到了MapperScannerConfigurer和注解等知识。对这些知识不熟悉的读者,可参考上篇博文:http://legend2011.blog.51cto.com/3018495/980150):

  1. <?xmlversion="1.0"encoding="utf8"?>

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  3. <!--与以前一样,namespace的值是对应的映射器接口的完整名称-->

  4. <mappernamespace="com.abc.mapper.TeacherMapper">

  5.          <!--TeacherMapper接口中getById方法对应的SQL语句。  

  6.          查询教师及其指导的学生的信息。由于教师、学生都有  

  7.          id、name、gender等属性,因此给教师的字段都起了别名-->

  8. <selectid="getById"parameterType="int"resultMap="supervisorResultMap">

  9.           select t.id t_id, t.name t_name, t.gender t_gender,  

  10.           t.research_area t_research_area, t.title t_title,  

  11.           s.id,s.name, s.gender,s.major,s.grade  

  12.           from teacher t,student s where t.id=#{id}  

  13.           and s.supervisor_id = t.id  

  14. </select>

  15. <!--教师实体映射-->

  16. <resultMapid="supervisorResultMap"type="Teacher">

  17. <idproperty="id"column="t_id"/>

  18. <resultproperty="name"column="t_name"/>

  19. <resultproperty="gender"column="t_gender"/>

  20. <resultproperty="researchArea"column="t_research_area"/>

  21. <resultproperty="title"column="t_title"/>

  22.             <!--需要注意的是,上面的select语句中学生的字段名/别名应与  

  23.             下面的column属性一致。ofType指collection包含的元素的类型,  

  24.             此属性不可少-->

  25. <collectionproperty="supStudents"ofType="Student">

  26. <idproperty="id"column="id"/>

  27. <resultproperty="name"column="name"/>

  28. <resultproperty="gender"column="gender"/>

  29. <resultproperty="major"column="major"/>

  30. <resultproperty="grade"column="grade"/>

  31.                <!--映射学生的指导教师属性,用到了  

  32.                supervisorResultMap本身-->

  33. <associationproperty="supervisor"

  34. resultMap="supervisorResultMap"/>

  35. </collection>

  36. </resultMap>

  37. </mapper>

      运行程序结果如下: 

       与以前的写法相比,这种写法的缺点是学生实体映射被嵌入到教师实体映射中,因此学生实体映射不能被重用。

二、嵌套的select语句

      这种方式是使用一条单独的select语句来加载关联的实体(在本例中就是学生实体),然后在collection元素中引用此select语句(注:此方法会产生N+1问题,关于这个问题可参考本系列博客中的“MyBatis中的N+1问题”)。首先修改TeacherMapper.xml如下(点击此处进入嵌套select语句形式示例源码下载页面):

  1. <?xmlversion="1.0"encoding="utf8"?>

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  3. <!--与以前一样,namespace的值是对应的映射器接口的完整名称-->

  4. <mappernamespace="com.abc.mapper.TeacherMapper">

  5.          <!--TeacherMapper接口中getById方法对应的SQL语句。  

  6.          查询教师的信息。-->

  7. <selectid="getById"parameterType="int"resultMap="supervisorResultMap">

  8.           select * from teacher where id=#{id}  

  9. </select>

  10. <!--教师实体映射-->

  11. <resultMapid="supervisorResultMap"type="Teacher">

  12. <idproperty="id"column="id"/>

  13. <resultproperty="name"column="name"/>

  14. <resultproperty="gender"column="gender"/>

  15. <resultproperty="researchArea"column="research_area"/>

  16. <resultproperty="title"column="title"/>

  17.             <!--ofType指collection包含的元素的类型,此属性不可少。  

  18.             column属性指把上述的getById的select语句中的教师id列的值作为参数  

  19.             传递给将要引用到的下述的getStudents的select语句,此属性不可少。  

  20.             引用的形式为:命名空间.select语句id-->

  21. <collectionproperty="supStudents"column="id"ofType="Student"

  22. select="com.abc.mapper.StudentMapper.getStudents"/>

  23. </resultMap>

  24. </mapper>

       在这里把根据指导教师id查询学生信息的SQL语句写在StudentMapper.xml中,并引用其中的学生实体映射studentResultMap。修改StudentMapper.xml如下:

  1. <?xmlversion="1.0"encoding="utf8"?>

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  3. <mappernamespace="com.abc.mapper.StudentMapper">

  4. <resultMapid="studentResultMap"type="Student">

  5. <idproperty="id"column="id"/>

  6. <resultproperty="name"column="name"/>

  7. <resultproperty="gender"column="gender"/>

  8. <resultproperty="major"column="major"/>

  9. <resultproperty="grade"column="grade"/>

  10.           <!--在这里引用supervisorResultMap和getById,亦采用  

  11.           命名空间名.相关元素id的形式。column="supervisor_id"

  12.           属性不可少-->

  13. <associationproperty="supervisor"

  14. resultMap="com.abc.mapper.TeacherMapper.supervisorResultMap"

  15. select="com.abc.mapper.TeacherMapper.getById"column="supervisor_id"/>

  16. </resultMap>

  17. <!--根据指导教师id查询学生信息-->

  18. <selectid="getStudents"parameterType="int"

  19. resultMap="studentResultMap">

  20.             select * from student where supervisor_id = #{id}  

  21. </select>

  22. </mapper>

      执行结果如下:

posted on 2013-09-11 13:44 姚先进 阅读(401) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: