一、嵌套的resultMap
這 種方法本質上就是上篇博文介紹的方法,只是把教師實體映射從association元素中提取出來,用一個resultMap元素表示。然后 association元素再引用這個resultMap元素。修改上篇博文示例的StudentMapper.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"> <select id="getById" parameterType="int" resultMap="studentResultMap"> select s.id s_id, s.name s_name, s.gender s_gender, s.major s_major, s.grade s_grade, t.id t_id, t.name t_name, t.gender t_gender, t.title t_title, t.research_area t_research_area from student s left join teacher t on s.supervisor_id = t.id where s.id=#{id} </select> <resultMap id="studentResultMap" type="Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> <result property="gender" column="s_gender"/> <result property="major" column="s_major"/> <result property="grade" column="s_grade"/> <!--使用resultMap屬性引用下面的教師實體映射--> <association property="supervisor" javaType="Teacher" resultMap="supervisorResultMap"/> </resultMap> <!--教師實體映射--> <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"/> </resultMap> </mapper>
在 這里,為了讓select語句更加清晰可讀,每個字段都使用了別名。association元素的屬性javaType="Teacher"可以不要,不 像上篇博文示例那樣,沒有此屬性即報錯。這大概是因為引用的resultMap元素已經指明了映射的類型為“Teacher”。另外,今天偶然發現,把 StudentMapper.xml的encoding屬性由“UTF-8”改為“utf8”即可添加中文注釋。
運行結果如下:
這種方式的好處是此resultMap元素可在其它地方被重用(可在博文下方附件下載處下載示例源碼)。
二、嵌套的select語句
這種方式是使用一條單獨的select語句來加載關聯的實體(在本例中就是教師實體),然后在association元素中引用此select語句(注:此方法會產生N+1問題,關於這個問題可參考本系列博客中的“MyBatis中的N+1問題”)。修改StudentMapper.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"> <select id="getById" parameterType="int" resultMap="studentResultMap"> select id,name,gender,major,grade,supervisor_id from student where id=#{id} </select> <select id="selectSupervisor" parameterType="int" resultMap="supervisorResultMap"> select id,name,gender,title,research_area from teacher where id=#{id} </select> <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"/> <!--column="supervisor_id"不能少。此列的值作為參數 傳遞給要引用的select語句,用來查詢相應學生的指導教師 的信息。select屬性指定要引用的select語句--> <association property="supervisor" javaType="Teacher" column="supervisor_id" select="selectSupervisor"/> </resultMap> <!--教師實體映射--> <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"/> </resultMap> </mapper>
association元素的屬性javaType="Teacher"也可以不要,這大概也是因為引用的select語句中已經指明了要用到的resultMap。
執行結果如下(可在博文下方附件下載處下載示例源碼):