一個學生可選多門課程,一門課程可被多個學生選擇,典型多對多關係。需通過中間表 student_course 關聯。
DROP DATABASE IF EXISTS mybatis;
CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8;
USE mybatis;
DROP TABLE IF EXISTS student, course, student_course;
CREATE TABLE student (
sid INT PRIMARY KEY,
sname VARCHAR(32)
);
CREATE TABLE course (
cid INT PRIMARY KEY,
cname VARCHAR(32)
);
CREATE TABLE student_course (
sid INT,
cid INT,
PRIMARY KEY (sid, cid),
FOREIGN KEY (sid) REFERENCES student(sid),
FOREIGN KEY (cid) REFERENCES course(cid)
);
INSERT INTO student VALUES (1,'哈哈'), (2,'呵呵');
INSERT INTO course VALUES (1,'java'), (2,'.NET');
INSERT INTO student_course VALUES (1,1), (1,2), (2,1), (2,2);
public class Student implements Serializable {
private Integer sid;
private String sname;
private List<Course> courses = new ArrayList<>();
// getter/setter
}
public class Course implements Serializable {
private Integer cid;
private String cname;
private List<Student> students = new ArrayList<>();
// getter/setter
}
<mapper namespace="studentMapper">
<resultMap type="many2many.Student" id="studentMap">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
</resultMap>
</mapper>
<mapper namespace="courseNamespace">
<resultMap type="many2many.Course" id="courseMap">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
</resultMap>
<!-- 查詢某學生選修的所有課程 -->
<select id="findAllByName" parameterType="string" resultMap="courseMap">
SELECT c.cname, c.cid
FROM student s, course c, student_course sc
WHERE s.sid = sc.sid AND c.cid = sc.cid AND s.sname = #{sname}
</select>
</mapper>
public class StudentCourseDAO {
public List<Course> findAllByName(String name) throws Exception {
try (SqlSession session = MyBatisUtil.getSqlSession()) {
return session.selectList("courseNamespace.findAllByName", name);
}
}
@Test
public void test() throws Exception {
List<Course> list = new StudentCourseDAO().findAllByName("哈哈");
list.forEach(c -> System.out.println(c.getCid() + ":" + c.getCname()));
}
}
<mappers>
<mapper resource="many2many/StudentMapper.xml"/>
<mapper resource="many2many/CourseMapper.xml"/>
</mappers>
resultMap 映射嵌套集合(此處簡化為單向查詢)。<collection> 標籤實現嵌套結果映射。