MyBatis多對多關聯查詢示例——MyBatis學習筆記之十八

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文件中的idgetByStudentIdselect元素,這裏的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佈局

運行結果以下: 學習

wKiom1NX0WuQ9mnBAAGF5yfxGfs220.jpg

如今實現課程端功能,即根據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元素的繼承simpleStudentStudentMapper.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());
}
}

執行結果以下:

wKioL1NXzrjyebfJAAGS3KWHa6I873.jpg

      猛戳這裏全面系統地學習MyBatis 3

      MyBatis技術交流羣:188972810,或掃描二維碼:

wKioL1SaztmBchKiAADsv4YAWBY259.jpg


【MyBatis學習筆記】系列之預備篇一:ant的下載與安裝

【MyBatis學習筆記】系列之預備篇二:ant入門示例

【MyBatis學習筆記】系列之一:MyBatis入門示例

【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

MyBatis中如何經過繼承SqlSessionDaoSupport來編寫DAO(一)

MyBatis中如何經過繼承SqlSessionDaoSupport來編寫DAO(二)

相關文章
相關標籤/搜索