天天看點

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

一、嵌套的resultMap

      這種方法本質上就是上篇博文介紹的方法,隻是把教師實體映射從association元素中提取出來,用一個resultMap元素表示。然後association元素再引用這個resultMap元素。修改上篇博文示例的StudentMapper.xml如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf8"</code><code>?&gt;</code>

<code>&lt;!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"&gt;</code>

<code>&lt;</code><code>mapper</code> <code>namespace</code><code>=</code><code>"com.abc.mapper.StudentMapper"</code><code>&gt;</code>

<code>&lt;</code><code>select</code> <code>id</code><code>=</code><code>"getById"</code> <code>parameterType</code><code>=</code><code>"int"</code> <code>resultMap</code><code>=</code><code>"studentResultMap"</code><code>&gt;</code>

<code>select s.id s_id,</code>

<code>s.name s_name,</code>

<code>s.gender s_gender,</code>

<code>s.major s_major,</code>

<code>s.grade s_grade,</code>

<code>t.id t_id,</code>

<code>t.name t_name,</code>

<code>t.gender t_gender,</code>

<code>t.title t_title,</code>

<code>t.research_area t_research_area</code>

<code>from student s left join teacher t</code>

<code>on s.supervisor_id = t.id</code>

<code>where s.id=#{id}</code>

<code>&lt;/</code><code>select</code><code>&gt;</code>

<code>&lt;</code><code>resultMap</code> <code>id</code><code>=</code><code>"studentResultMap"</code> <code>type</code><code>=</code><code>"Student"</code><code>&gt;</code>

<code>&lt;</code><code>id</code> <code>property</code><code>=</code><code>"id"</code> <code>column</code><code>=</code><code>"s_id"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"name"</code> <code>column</code><code>=</code><code>"s_name"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"gender"</code> <code>column</code><code>=</code><code>"s_gender"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"major"</code>  <code>column</code><code>=</code><code>"s_major"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"grade"</code>  <code>column</code><code>=</code><code>"s_grade"</code><code>/&gt;</code>

<code>&lt;!--使用resultMap屬性引用下面的教師實體映射--&gt;</code>

<code>&lt;</code><code>association</code> <code>property</code><code>=</code><code>"supervisor"</code> <code>javaType</code><code>=</code><code>"Teacher"</code>

<code>resultMap</code><code>=</code><code>"supervisorResultMap"</code><code>/&gt;</code>

<code>&lt;/</code><code>resultMap</code><code>&gt;</code>

<code>&lt;!--教師實體映射--&gt;</code>

<code>&lt;</code><code>resultMap</code> <code>id</code><code>=</code><code>"supervisorResultMap"</code> <code>type</code><code>=</code><code>"Teacher"</code><code>&gt;</code>

<code>&lt;</code><code>id</code> <code>property</code><code>=</code><code>"id"</code> <code>column</code><code>=</code><code>"t_id"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"name"</code> <code>column</code><code>=</code><code>"t_name"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"gender"</code> <code>column</code><code>=</code><code>"t_gender"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"researchArea"</code> <code>column</code><code>=</code><code>"t_research_area"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"title"</code> <code>column</code><code>=</code><code>"t_title"</code><code>/&gt;</code>

<code>&lt;/</code><code>mapper</code><code>&gt;</code>

      在這裡,為了讓select語句更加清晰可讀,每個字段都使用了别名。association元素的屬性javaType="Teacher"可以不要,不像上篇博文示例那樣,沒有此屬性即報錯。這大概是因為引用的resultMap元素已經指明了映射的類型為“Teacher”。另外,今天偶然發現,把StudentMapper.xml的encoding屬性由“UTF-8”改為“utf8”即可添加中文注釋。

      運作結果如下:

<a target="_blank"></a>

      這種方式的好處是此resultMap元素可在其它地方被重用(可在博文下方附件下載下傳處下載下傳示例源碼)。

二、嵌套的select語句

<code>select id,name,gender,major,grade,supervisor_id from student where id=#{id}</code>

<code>&lt;</code><code>select</code> <code>id</code><code>=</code><code>"selectSupervisor"</code> <code>parameterType</code><code>=</code><code>"int"</code> <code>resultMap</code><code>=</code><code>"supervisorResultMap"</code><code>&gt;</code>

<code>select id,name,gender,title,research_area</code>

<code>from teacher where id=#{id}</code>

<code>&lt;</code><code>id</code> <code>property</code><code>=</code><code>"id"</code> <code>column</code><code>=</code><code>"id"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"name"</code> <code>column</code><code>=</code><code>"name"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"gender"</code> <code>column</code><code>=</code><code>"gender"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"major"</code>  <code>column</code><code>=</code><code>"major"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"grade"</code>  <code>column</code><code>=</code><code>"grade"</code><code>/&gt;</code>

<code>&lt;!--column="supervisor_id"不能少。此列的值作為參數</code>

<code>傳遞給要引用的select語句,用來查詢相應學生的指導教師</code>

<code>的資訊。select屬性指定要引用的select語句--&gt;</code>

<code>column</code><code>=</code><code>"supervisor_id"</code> <code>select</code><code>=</code><code>"selectSupervisor"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"researchArea"</code> <code>column</code><code>=</code><code>"research_area"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"title"</code> <code>column</code><code>=</code><code>"title"</code><code>/&gt;</code>

       association元素的屬性javaType="Teacher"也可以不要,這大概也是因為引用的select語句中已經指明了要用到的resultMap。

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

本文轉自 NashMaster2011 51CTO部落格,原文連結:http://blog.51cto.com/legend2011/940072,如需轉載請自行聯系原作者