與association同樣,collection元素也有兩種形式,現介紹以下: html
1、嵌套的resultMap mybatis
實際上之前的示例使用的就是這種方法,今天介紹它的另外一種寫法。仍是以教師映射爲例,修改映射文件TeacherMapper.xml以下(點擊此處進入嵌套resultMap形式的示例×××頁面。注:本示例代碼是在修改本系列的上篇博文示例代碼的基礎上完成的,用到了MapperScannerConfigurer和註解等知識。對這些知識不熟悉的讀者,可參考上篇博文:http://legend2011.blog.51cto.com/3018495/980150): app
<?xml version="1.0" encoding="utf8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--與之前同樣,namespace的值是對應的映射器接口的完整名稱--> <mapper namespace="com.abc.mapper.TeacherMapper"> <!--TeacherMapper接口中getById方法對應的SQL語句。 查詢教師及其指導的學生的信息。因爲教師、學生都有 id、name、gender等屬性,所以給教師的字段都起了別名--> <select id="getById" parameterType="int" resultMap="supervisorResultMap"> select t.id t_id, t.name t_name, t.gender t_gender, t.research_area t_research_area, t.title t_title, s.id,s.name, s.gender,s.major,s.grade from teacher t,student s where t.id=#{id} and s.supervisor_id = t.id </select> <!--教師實體映射--> <resultMap id="supervisorResultMap" type="Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> <result property="gender" column="t_gender"/> <result property="researchArea" column="t_research_area"/> <result property="title" column="t_title"/> <!--須要注意的是,上面的select語句中學生的字段名/別名應與 下面的column屬性一致。ofType指collection包含的元素的類型, 此屬性不可少--> <collection property="supStudents"ofType="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> <!--映射學生的指導教師屬性,用到了 supervisorResultMap自己--> <association property="supervisor" resultMap="supervisorResultMap"/> </collection> </resultMap> </mapper>
運行程序結果以下: ide
與之前的寫法相比,這種寫法的缺點是學生實體映射被嵌入到教師實體映射中,所以學生實體映射不能被重用。 學習
2、嵌套的select語句 spa
這種方式是使用一條單獨的select語句來加載關聯的實體(在本例中就是學生實體),而後在collection元素中引用此select語句(注:此方法會產生N+1問題,關於這個問題可參考本系列博客中的「MyBatis中的N+1問題」)。首先修改TeacherMapper.xml以下(點擊此處進入嵌套select語句形式示例×××頁面): 日誌
<?xml version="1.0" encoding="utf8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--與之前同樣,namespace的值是對應的映射器接口的完整名稱--> <mapper namespace="com.abc.mapper.TeacherMapper"> <!--TeacherMapper接口中getById方法對應的SQL語句。 查詢教師的信息。--> <select id="getById" parameterType="int" resultMap="supervisorResultMap"> select * from teacher where id=#{id} </select> <!--教師實體映射--> <resultMap id="supervisorResultMap" type="Teacher"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="researchArea" column="research_area"/> <result property="title" column="title"/> <!--ofType指collection包含的元素的類型,此屬性不可少。 column屬性指把上述的getById的select語句中的教師id列的值做爲參數 傳遞給將要引用到的下述的getStudents的select語句,此屬性不可少。 引用的形式爲:命名空間.select語句id--> <collection property="supStudents" column="id" ofType="Student" select="com.abc.mapper.StudentMapper.getStudents"/> </resultMap> </mapper>
在這裏把根據指導教師id查詢學生信息的SQL語句寫在StudentMapper.xml中,並引用其中的學生實體映射studentResultMap。修改StudentMapper.xml以下: xml
<?xml version="1.0" encoding="utf8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.abc.mapper.StudentMapper"> <resultMap id="studentResultMap" type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> <!--在這裏引用supervisorResultMap和getById, 亦採用命名空間名.相關元素id的形式。 column="supervisor_id"屬性不可少--> <association property="supervisor" resultMap="com.abc.mapper.TeacherMapper.supervisorResultMap" select="com.abc.mapper.TeacherMapper.getById" column="supervisor_id"/> </resultMap> <!--根據指導教師id查詢學生信息--> <select id="getStudents" parameterType="int" resultMap="studentResultMap"> select * from student where supervisor_id = #{id} </select> </mapper>
執行結果以下: htm
從以上可看出,collection的這兩種形式與association的兩種形式很是類似。 blog
MyBatis技術交流羣:188972810,或掃描二維碼:
【MyBatis學習筆記】系列之預備篇一:ant的下載與安裝
【MyBatis學習筆記】系列之二:MyBatis增刪改示例
【MyBatis學習筆記】系列之三:MyBatis的association示例
【MyBatis學習筆記】系列之四:MyBatis association的兩種形式
【MyBatis學習筆記】系列之五:MyBatis與Spring集成示例
【MyBatis學習筆記】系列之六:MyBatis與Spring集成示例續
【MyBatis學習筆記】系列之七:MyBatis一對多雙向關聯
【MyBatis學習筆記】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis學習筆記】系列之九:MyBatis collection的兩種形式
【MyBatis學習筆記】系列之十:MyBatis日誌之Log4j示例
【MyBatis學習筆記】系列之十一:MyBatis多參數傳遞之註解方式示例
【MyBatis學習筆記】系列之十二:MyBatis多參數傳遞之默認命名方式示例
【MyBatis學習筆記】系列之十三:MyBatis多參數傳遞之Map方式示例
【MyBatis學習筆記】系列之十四:MyBatis中的N+1問題
【MyBatis學習筆記】系列之十五:MyBatis多參數傳遞之混合方式
【MyBatis學習筆記】系列之十六:Spring聲明式事務管理示例
【MyBatis學習筆記】系列之十七:MyBatis多對多保存示例
【MyBatis學習筆記】系列之十八:MyBatis多對多關聯查詢示例
【MyBatis學習筆記】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2