天天看点

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