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,如需转载请自行联系原作者