天天看點

MyBatis多對多關聯查詢示例——MyBatis學習筆記之十八

MyBatis系列的上一篇部落格發表時,笑笑還沒有出生。轉眼間八個月過去了,他已經是個大寶寶了。這麼長時間未更新MyBatis系列的部落格,想來真是罪過。不過有了寶寶之後,的确會分散自己很大一部分精力。

首先實作學生端功能,即根據id查詢出學生及其選修的課程。步驟如下:

1、在StudentMapper.xml中編寫id為“studentResultMap”的resultMap元素,如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<code>&lt;!-- 查詢學生的結果映射,隻映射簡單屬性 --&gt;</code>

<code>&lt;</code><code>resultMap</code> <code>id</code><code>=</code><code>"simpleStudent"</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;/</code><code>resultMap</code><code>&gt;</code>

<code>&lt;!-- 查詢學生的結果映射,含指導教師、選修課程等複雜屬性的映射,從simpleStudent繼承而來,提高resultMap的靈活性和重用性 --&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>extends</code><code>=</code><code>"simpleStudent"</code><code>&gt;</code>

<code>&lt;!--association的嵌套的結果映射方式。 --&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>"com.abc.mapper.TeacherMapper.simpleTeacher"</code><code>&gt;</code>

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

<code>&lt;!-- 嵌入的select查詢方式,查詢學生選修的課程。采用了CourseMapper.xml檔案中的id為getByStudentId的select元素,這裡的com.abc.mapper.CourseMapper是其命名空間名 --&gt;</code>

<code>&lt;</code><code>collection</code> <code>property</code><code>=</code><code>"courses"</code> <code>ofType</code><code>=</code><code>"Course"</code> <code>select</code><code>=</code><code>"com.abc.mapper.CourseMapper.getByStudentId"</code> <code>column</code><code>=</code><code>"s_id"</code><code>&gt;</code>

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

2、在CourseMapper.xml檔案中相應的select元素及結果映射如下所示:

<code>&lt;!--課程實體映射--&gt;</code>

<code>&lt;</code><code>resultMap</code> <code>id</code><code>=</code><code>"simpleCourse"</code> <code>type</code><code>=</code><code>"Course"</code><code>&gt;</code>

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

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

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

<code>&lt;</code><code>select</code> <code>id</code><code>=</code><code>"getByStudentId"</code> <code>parameterType</code><code>=</code><code>"int"</code>

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

<code>select c.id course_id,course_code,course_name</code>

<code>from course c,student_course sc where sc.student_id=#{id} and sc.course_id = c.id</code>

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

測試類如下:

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

<code>package</code> <code>com.demo;</code>

<code>import</code> <code>java.util.List;</code>

<code>import</code> <code>org.springframework.context.ApplicationContext;</code>

<code>import</code> <code>com.abc.service.CourseService;</code>

<code>import</code> <code>com.abc.service.StudentService;</code>

<code>import</code> <code>com.abc.domain.Course;</code>

<code>import</code> <code>com.abc.domain.Student;</code>

<code>import</code> <code>com.abc.domain.Teacher;</code>

<code>import</code> <code>org.springframework.context.support.ClassPathXmlApplicationContext;</code>

<code>public</code> <code>class</code> <code>ManyToManyQuery</code>

<code>{</code>

<code>private</code> <code>static</code> <code>ApplicationContext ctx;</code>

<code>static</code>

<code>//在類路徑下尋找spring主配置檔案,啟動spring容器</code>

<code>ctx = </code><code>new</code> <code>ClassPathXmlApplicationContext(</code><code>"classpath:applicationContext.xml"</code><code>);</code>

<code>}</code>

<code>public</code> <code>static</code> <code>void</code> <code>main(String[] args)</code>

<code>int</code> <code>i = </code><code>0</code><code>, length = </code><code>0</code><code>;</code>

<code>List&lt;Course&gt; list = </code><code>null</code><code>;</code>

<code>StudentService studentService = (StudentService)ctx.getBean(</code><code>"studentService"</code><code>);</code>

<code>Student student = studentService.getById(</code><code>7</code><code>);</code>

<code>//擷取該學生選修的課程</code>

<code>list = student.getCourses();</code>

<code>StringBuilder info = </code><code>new</code> <code>StringBuilder(</code><code>"學生姓名:"</code><code>);</code>

<code>info.append(student.getName());</code>

<code>info.append(</code><code>"    "</code><code>);</code>

<code>length = list.size();</code>

<code>while</code><code>(i &lt; length)</code>

<code>info.append(</code><code>"所選課程名稱:"</code><code>);</code>

<code>info.append(list.get(i).getCourseName());</code>

<code>i++;</code>

<code>System.out.println(info.toString());</code>

運作結果如下:

現在實作課程端功能,即根據id查詢出課程及選修這門課程的學生。步驟如下:

1、在CourseMapper.java中聲明方法getById,即根據id查詢課程。代碼如下:

<code>public</code> <code>Course getById(</code><code>int</code> <code>id);</code>

2、在CourseMapper.xml中編寫對應的select語句,如下:

<code>&lt;!--根據id查詢課程及選修的學生--&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>"courseResutMap"</code><code>&gt;</code>

<code>select c.id course_id,c.course_code course_code,c.course_name course_name,</code>

<code>s.id s_id, s.name s_name, s.gender s_gender, s.grade s_grade, s.major s_major</code>

<code>from course c left join student_course sc on c.id = sc.course_id</code>

<code>left join student s on sc.student_id = s.id where c.id = #{id}</code>

3、此select語句用到了id為courseResutMap的resultMap元素,如下:

<code>&lt;!--課程實體映射,映射簡單屬性--&gt;</code>

<code>&lt;!--課程實體映射,除映射簡單屬性,還包含students複雜屬性映射--&gt;</code>

<code>&lt;</code><code>resultMap</code> <code>id</code><code>=</code><code>"courseResutMap"</code> <code>type</code><code>=</code><code>"Course"</code> <code>extends</code><code>=</code><code>"simpleCourse"</code><code>&gt;</code>

<code>&lt;</code><code>collection</code> <code>property</code><code>=</code><code>"students"</code> <code>resultMap</code><code>=</code><code>"com.abc.mapper.StudentMapper.simpleStudent"</code><code>/&gt;</code>

請注意,id為“simpleStudent”和“simpleCourse”的兩個resultMap元素都得到了重用。其中,StudentMapper.xml和CourseMapper.xml中各引用了simpleStudent一次,CourseMapper.xml中引用了simpleCourse兩次。

<code>List&lt;Student&gt; list = </code><code>null</code><code>;</code>

<code>CourseService courseService = (CourseService)ctx.getBean(</code><code>"courseService"</code><code>);</code>

<code>Course course = courseService.getById(</code><code>1</code><code>);</code>

<code>//擷取選修了此課程的學生</code>

<code>list = course.getStudents();</code>

<code>StringBuilder info = </code><code>new</code> <code>StringBuilder(</code><code>"課程名稱:"</code><code>);</code>

<code>info.append(course.getCourseName());</code>

<code>info.append(</code><code>"   選修此課程的學生姓名:"</code><code>);</code>

<code>info.append(list.get(i).getName());</code>

<code>info.append(</code><code>"   "</code><code>);</code>

執行結果如下:

<a href="http://s3.51cto.com/wyfs02/M01/24/FB/wKioL1NXzrjyebfJAAGS3KWHa6I873.jpg" target="_blank"></a>

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