一個學生能夠選多門課程,而一門課程能夠由多個學生選擇,這就是一個典型的多對多關聯關係。所謂多對多關係,實際上是由兩個互反的一對多關係組成。即多對多關係都會經過一箇中間表來創建,例如選課表。學生對於選課表來講是一對多,課程對於選課表來講也是一對多。php
學生表咱們以前已經建立了t_student,這裏就再也不從新建立了,下面建立一個課程表java
CREATE TABLE `t_course` ( `id` INT NOT NULL, `name` VARCHAR(20) NULL, PRIMARY KEY (`id`));
選課表:sql
CREATE TABLE `learnmybatis`.`t_student_course` ( `id` INT NOT NULL AUTO_INCREMENT, `sid` INT NULL, `cid` INT NULL, PRIMARY KEY (`id`));
初始化數據:數據庫
INSERT INTO `learnmybatis`.`t_course` (`id`, `name`) VALUES ('1001', 'SpringMVC'); INSERT INTO `learnmybatis`.`t_course` (`id`, `name`) VALUES ('1002', 'mybatis'); INSERT INTO `learnmybatis`.`t_course` (`id`, `name`) VALUES ('1003', 'Spring'); INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('1', '1001'); INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('1', '1002'); INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('1', '1003'); INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('3', '1001'); INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('3', '1002'); INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('4', '1001');
建立Course類apache
package com.monkey1024.bean; import java.util.List; public class Course { private int id; private String name; private List<Student> students; //省略getter、setter和toString }
在以前的Student類中添加List屬性表示課程:session
private List<Course> courses;
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.monkey1024.dao.CourseDao"> <resultMap id="courseMapper" type="Course"> <id property="id" column="cid"/> <result property="name" column="cname"/> <collection property="students" ofType="Student"> <id property="id" column="sid"/> <result property="name" column="sname"/> </collection> </resultMap> <select id="selectCourseStudent" resultMap="courseMapper"> SELECT c.id cid, c.name cname, s.id sid, s.name sname FROM t_course c, t_student s, t_student_course sc WHERE c.id = #{id} AND s.id = sc.sid AND c.id = sc.cid; </select> </mapper>
上面sql語句是三張表的關聯查詢,在collection中表示查詢出的學生數據,這裏其實能夠看作是一對多的查詢,由於咱們指定了課程編號。mybatis
package com.monkey1024.dao; import com.monkey1024.bean.Course; public interface CourseDao { Course selectCourseStudent(int id); }
package com.monkey1024.test; import com.monkey1024.bean.Course; import com.monkey1024.bean.Employee; import com.monkey1024.dao.CourseDao; import com.monkey1024.dao.EmployeeDao; import com.monkey1024.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.List; public class CourseTest01 { private SqlSession sqlSession; private CourseDao courseDao; /** * 測試時先執行該方法建立EmployeeDao對象 */ @Before public void initStudentDao(){ sqlSession = MyBatisUtil.getSqlSession(); //經過該方法能夠獲取CourseDao的對象 courseDao = sqlSession.getMapper(CourseDao.class); } /** * 執行完成後須要關閉sqlSession */ @After public void closeSession() { if (sqlSession != null) { sqlSession.close(); } } @Test public void selectCourseStudent(){ Course course = courseDao.selectCourseStudent(1001); System.out.println(course); } }
執行結束後能夠看到將課程和選擇該課程的全部學生所有查詢出來了。app