MyBatis系列的上一篇博客發表時,笑笑尚未出生。轉眼間八個月過去了,他已是個大寶寶了。這麼長時間未更新MyBatis系列的博客,想來真是罪過。不過有了寶寶以後,的確會分散本身很大一部分精力。 html
今天的示例是多對多關聯的查詢,這是在上一篇博客(MyBatis多對多保存示例)的基礎上完成的,仍然是處理學生與課程之間的多對多關聯(一個學生能夠選修多門課程,一門課程能夠被多個學生選修),相關的實體類和表結構信息請參考上篇博客。 java
從本篇博客起,示例工程就再也不用ant組織,而改用eclipse(示例工程源碼及數據庫腳本下載地址:http://down.51cto.com/data/1143560)。 spring
首先實現學生端功能,即根據id查詢出學生及其選修的課程。步驟以下: 數據庫
1、在StudentMapper.xml中編寫id爲「studentResultMap」的resultMap元素,以下: app
<!-- 查詢學生的結果映射,只映射簡單屬性 --> <resultMap id="simpleStudent" type="Student"> <id property="id" column="s_id" /> <result property="name" column="s_name" /> <result property="gender" column="s_gender" /> <result property="major" column="s_major" /> <result property="grade" column="s_grade" /> </resultMap> <!-- 查詢學生的結果映射,含指導教師、選修課程等複雜屬性的映射,從simpleStudent繼承而來,提升resultMap的靈活性和重用性 --> <resultMap id="studentResultMap" type="Student" extends="simpleStudent"> <!--association的嵌套的結果映射方式。 --> <association property="supervisor" javaType="Teacher" resultMap="com.abc.mapper.TeacherMapper.simpleTeacher"> </association> <!-- 嵌入的select查詢方式,查詢學生選修的課程。採用了CourseMapper.xml文件中的id爲getByStudentId的select元素,這裏的com.abc.mapper.CourseMapper是其命名空間名 --> <collection property="courses" ofType="Course" select="com.abc.mapper.CourseMapper.getByStudentId" column="s_id"> </collection> </resultMap>
這裏的關鍵點在於,爲了查詢學生選修的課程,用到了collection元素,其查詢方式是嵌套的select方式。其select語句採用了CourseMapper.xml文件中的id爲getByStudentId的select元素,這裏的com.abc.mapper.CourseMapper是其命名空間名(關於collection元素的嵌套select語句的方式,請參考本系列的博文:MyBatis collection的兩種形式)。注意這裏用到了resultMap元素的繼承,提升resultMap元素的靈活性和重用性。 dom
2、在CourseMapper.xml文件中相應的select元素及結果映射以下所示: eclipse
<!--課程實體映射--> <resultMap id="simpleCourse" type="Course"> <id property="id" column="course_id"/> <result property="courseCode" column="course_code"/> <result property="courseName" column="course_name"/> </resultMap> <select id="getByStudentId" parameterType="int" resultMap="simpleCourse"> select c.id course_id,course_code,course_name from course c,student_course sc where sc.student_id=#{id} and sc.course_id = c.id </select>
測試類以下: ide
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; List<Course> list = 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的相關知識。具體內容請參看做者的公開課:http://bbs.51cto.com/open/do/course/cid/65。 佈局
運行結果以下: 學習
如今實現課程端功能,即根據id查詢出課程及選修這門課程的學生。步驟以下:
一、在CourseMapper.java中聲明方法getById,即根據id查詢課程。代碼以下:
public Course getById(int id);
二、在CourseMapper.xml中編寫對應的select語句,以下:
<!--根據id查詢課程及選修的學生--> <select id="getById" parameterType="int" resultMap="courseResutMap"> select c.id course_id,c.course_code course_code,c.course_name course_name, s.id s_id, s.name s_name, s.gender s_gender, s.grade s_grade, s.major s_major from course c left join student_course sc on c.id = sc.course_id left join student s on sc.student_id = s.id where c.id = #{id} </select>
三、此select語句用到了id爲courseResutMap的resultMap元素,以下:
<!--課程實體映射,映射簡單屬性--> <resultMap id="simpleCourse" type="Course"> <id property="id" column="course_id"/> <result property="courseCode" column="course_code"/> <result property="courseName" column="course_name"/> </resultMap> <!--課程實體映射,除映射簡單屬性,還包含students複雜屬性映射--> <resultMap id="courseResutMap" type="Course" extends="simpleCourse"> <collection property="students" resultMap="com.abc.mapper.StudentMapper.simpleStudent"/> </resultMap>
這裏的關鍵點仍是用到了collection元素,只是此次用到了嵌套的resultMap形式(關於collection元素的嵌套的resultMap形式,請參考本系列的博文:MyBatis collection的兩種形式),並且在這裏也一樣用到了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; List<Student> list = 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學習筆記】系列之預備篇一:ant的下載與安裝
【MyBatis學習筆記】系列之二:MyBatis增刪改示例
【MyBatis學習筆記】系列之三:MyBatis的association示例
【MyBatis學習筆記】系列之四:MyBatis association的兩種形式
【MyBatis學習筆記】系列之五:MyBatis與Spring集成示例
【MyBatis學習筆記】系列之六:MyBatis與Spring集成示例續
【MyBatis學習筆記】系列之七:MyBatis一對多雙向關聯
【MyBatis學習筆記】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis學習筆記】系列之九:MyBatis collection的兩種形式
【MyBatis學習筆記】系列之十:MyBatis日誌之Log4j示例
【MyBatis學習筆記】系列之十一:MyBatis多參數傳遞之註解方式示例
【MyBatis學習筆記】系列之十二:MyBatis多參數傳遞之默認命名方式示例
【MyBatis學習筆記】系列之十三:MyBatis多參數傳遞之Map方式示例
【MyBatis學習筆記】系列之十四:MyBatis中的N+1問題
【MyBatis學習筆記】系列之十五:MyBatis多參數傳遞之混合方式
【MyBatis學習筆記】系列之十六:Spring聲明式事務管理示例
【MyBatis學習筆記】系列之十七:MyBatis多對多保存示例
【MyBatis學習筆記】系列之十八:MyBatis多對多關聯查詢示例
【MyBatis學習筆記】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2