MyBatis系列的上一篇博客发表时,笑笑还没有出生。转眼间八个月过去了,他已经是个大宝宝了。这么长时间未更新MyBatis系列的博客,想来真是罪过。不过有了宝宝之后,的确会分散自己很大一部分精力。
今天的示例是多对多关联的查询,这是在上一篇博客()的基础上完成的,仍然是处理学生与课程之间的多对多关联(一个学生可以选修多门课程,一门课程可以被多个学生选修),相关的实体类和表结构信息请参考上篇博客。
从本篇博客起,示例工程就不再用ant组织,而改用eclipse(示例工程源码及数据库脚本下载地址:)。
首先实现学生端功能,即根据id查询出学生及其选修的课程。步骤如下:
1、在StudentMapper.xml中编写id为“studentResultMap”的resultMap元素,如下:
这里的关键点在于,为了查询学生选修的课程,用到了collection元素,其查询方式是嵌套的select方式。其select语句采用了CourseMapper.xml文件中的id为getByStudentId的select元素,这里的com.abc.mapper.CourseMapper是其命名空间名(关于collection元素的嵌套select语句的方式,请参考本系列的博文:)。注意这里用到了resultMap元素的继承,提高resultMap元素的灵活性和重用性。
2、在CourseMapper.xml文件中相应的select元素及结果映射如下所示:
测试类如下:
package com.demo;import java.util.List;import org.springframework.context.ApplicationContext;import com.abc.service.CourseService;import com.abc.service.StudentService;import com.abc.domain.Course;import com.abc.domain.Student;import com.abc.domain.Teacher;import org.springframework.context.support.ClassPathXmlApplicationContext;public class ManyToManyQuery{private static ApplicationContext ctx;static{//在类路径下寻找spring主配置文件,启动spring容器ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");}public static void main(String[] args){int i = 0, length = 0;Listlist = null;StudentService studentService = (StudentService)ctx.getBean("studentService");Student student = studentService.getById(7);//获取该学生选修的课程list = student.getCourses();StringBuilder info = new StringBuilder("学生姓名:");info.append(student.getName());info.append(" ");length = list.size();while(i < length){info.append("所选课程名称:");info.append(list.get(i).getCourseName());info.append(" ");i++;}System.out.println(info.toString());}}
注意,与前面的工程相比,本工程的文件布局和名称都有一些变化,新增了com.abc.service包,用到了更多的Spring的相关知识。具体内容请参看作者的公开课:。
运行结果如下:
现在实现课程端功能,即根据id查询出课程及选修这门课程的学生。步骤如下:
1、在CourseMapper.java中声明方法getById,即根据id查询课程。代码如下:
public Course getById(int id);
2、在CourseMapper.xml中编写对应的select语句,如下:
3、此select语句用到了id为courseResutMap的resultMap元素,如下:
这里的关键点还是用到了collection元素,只是这次用到了嵌套的resultMap形式(关于collection元素的嵌套的resultMap形式,请参考本系列的博文:),而且在这里也同样用到了resultMap元素的继承。simpleStudent是StudentMapper.xml文件中的resultMap元素,com.abc.mapper.StudentMapper是其命名空间名。
请注意,id为“simpleStudent”和“simpleCourse”的两个resultMap元素都得到了重用。其中,StudentMapper.xml和CourseMapper.xml中各引用了simpleStudent一次,CourseMapper.xml中引用了simpleCourse两次。
测试类如下:
package com.demo;import java.util.List;import org.springframework.context.ApplicationContext;import com.abc.service.CourseService;import com.abc.service.StudentService;import com.abc.domain.Course;import com.abc.domain.Student;import com.abc.domain.Teacher;import org.springframework.context.support.ClassPathXmlApplicationContext;public class ManyToManyQuery{private static ApplicationContext ctx;static{//在类路径下寻找spring主配置文件,启动spring容器ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");}public static void main(String[] args){int i = 0, length = 0;Listlist = null;CourseService courseService = (CourseService)ctx.getBean("courseService");Course course = courseService.getById(1);//获取选修了此课程的学生list = course.getStudents();length = list.size();StringBuilder info = new StringBuilder("课程名称:");info.append(course.getCourseName());info.append(" 选修此课程的学生姓名:");while(i < length){info.append(list.get(i).getName());info.append(" ");i++;}System.out.println(info.toString());}}
执行结果如下:
MyBatis技术交流群:188972810,或扫描二维码:
【MyBatis学习笔记】系列之十八:MyBatis多对多关联查询示例