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><!-- 查詢學生的結果映射,隻映射簡單屬性 --></code>
<code><</code><code>resultMap</code> <code>id</code><code>=</code><code>"simpleStudent"</code> <code>type</code><code>=</code><code>"Student"</code><code>></code>
<code><</code><code>id</code> <code>property</code><code>=</code><code>"id"</code> <code>column</code><code>=</code><code>"s_id"</code> <code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"name"</code> <code>column</code><code>=</code><code>"s_name"</code> <code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"gender"</code> <code>column</code><code>=</code><code>"s_gender"</code> <code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"major"</code> <code>column</code><code>=</code><code>"s_major"</code> <code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"grade"</code> <code>column</code><code>=</code><code>"s_grade"</code> <code>/></code>
<code></</code><code>resultMap</code><code>></code>
<code><!-- 查詢學生的結果映射,含指導教師、選修課程等複雜屬性的映射,從simpleStudent繼承而來,提高resultMap的靈活性和重用性 --></code>
<code><</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>></code>
<code><!--association的嵌套的結果映射方式。 --></code>
<code><</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>></code>
<code></</code><code>association</code><code>></code>
<code><!-- 嵌入的select查詢方式,查詢學生選修的課程。采用了CourseMapper.xml檔案中的id為getByStudentId的select元素,這裡的com.abc.mapper.CourseMapper是其命名空間名 --></code>
<code><</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>></code>
<code></</code><code>collection</code><code>></code>
2、在CourseMapper.xml檔案中相應的select元素及結果映射如下所示:
<code><!--課程實體映射--></code>
<code><</code><code>resultMap</code> <code>id</code><code>=</code><code>"simpleCourse"</code> <code>type</code><code>=</code><code>"Course"</code><code>></code>
<code><</code><code>id</code> <code>property</code><code>=</code><code>"id"</code> <code>column</code><code>=</code><code>"course_id"</code><code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"courseCode"</code> <code>column</code><code>=</code><code>"course_code"</code><code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"courseName"</code> <code>column</code><code>=</code><code>"course_name"</code><code>/></code>
<code><</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>></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></</code><code>select</code><code>></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<Course> 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 < 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><!--根據id查詢課程及選修的學生--></code>
<code><</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>></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><!--課程實體映射,映射簡單屬性--></code>
<code><!--課程實體映射,除映射簡單屬性,還包含students複雜屬性映射--></code>
<code><</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>></code>
<code><</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>/></code>
請注意,id為“simpleStudent”和“simpleCourse”的兩個resultMap元素都得到了重用。其中,StudentMapper.xml和CourseMapper.xml中各引用了simpleStudent一次,CourseMapper.xml中引用了simpleCourse兩次。
<code>List<Student> 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,如需轉載請自行聯系原作者