天天看點

MyBatis association的兩種形式——MyBatis學習筆記之四

一、嵌套的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。

       執行結果如下(可在博文下方附件下載下傳處下載下傳示例源碼):

MyBatis association的兩種形式——MyBatis學習筆記之四

        猛戳這裡全面系統地學習MyBatis 3

        MyBatis技術交流群:188972810,或掃描二維碼:

MyBatis association的兩種形式——MyBatis學習筆記之四

【MyBatis學習筆記】系列之預備篇一:ant的下載下傳與安裝

【MyBatis學習筆記】系列之預備篇二:ant入門示例

【MyBatis學習筆記】系列之一:MyBatis入門示例

【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多對多關聯查詢示例

繼續閱讀