MyBatis 框架的多表查询的实现

发布时间 2023-03-31 16:56:21作者: Linqylin
1、表与表的联系类型
 一对一(1:1)
 一对多(1:n 或 n:1)
 多对多(n:m )
2、Mybatis 中实现多表查询的重要标签 resultMap
  在 Mybatis 框架中,resultMap 标签可以表示两个表之间的一对多和一对一关系。
  如:一个系可以有多个学生,如果想查询每个系的学生信息时,可以在DepartmentMapper.xml 局部配置文件中,使用 resultMap 标签进行如下配置:
<resultMap id="departmentMap" type="cn.java.pojo.Department">
<!—定义主键-->
<id property="dept_name" column="dept_name"/>
<result property="building" column="building"/> <!—定义普通属性-->
<result property="budget" column="budget"/>
<!--配置一个包含关系 “有很多”关系,表达一对多联系 -->
<collection property="students" ofType="cn.java.pojo.Student">
<id property="ID" column="ID"/>
<result property="sname" column="name"/>
<result property="sdept" column="dept_name"/>
<result property="tot_cred" column="tot_cred"/>
</collection>
</resultMap>
  如:一个系有一个系主任,如果想查询每个系的系主任信息时,可以在DepartmentMapper.xml 局部配置文件中,使用 resultMap 标签进行如下配置:
<resultMap id="departmentMap" type="cn.java.pojo.Department">
<!—定义主键-->
<id property="dept_name" column="dept_name"/>
<result property="building" column="building"/> <!—定义普通属性-->
<result property="budget" column="budget"/>
<!—每个系有一个系主任,表达一对一联系-->
<association property="Dean" javaType="cn.java.pojo.Dean">
<id property="id" column="did"/>
<result property="name" column="name"/>
</association>
</resultMap>
 重要标签或属性说明:
<resultMap id="departmentMap" type="cn.java.pojo.Department">
功能: resultMap: 进行多表查询的查询结果集说明;
id: 给结果集命名,要唯一
type: 对应相应的实体类
 <id property="dept_name" column="dept_name"/>
功能:定义该实体类的主键
property="dept_name"
定义在实体类中的主键的属性名
column="dept_name"
定义在关系表中的主键的字段名
 <result property="building" column="building"/>
功能: 定义实体类的普通属性
property=" building " 定义在实体类中的普通属性名
column=" building "
定义在关系表中的普通字段名
 <collection property="students" ofType="cn.java.bean.Student">
功能:定义一对多关系,如一个系里有多个学生,定义多方的数据集合
property="students"
定义多方学生集合
ofType="cn.java.bean.Student"
定义对应的实体类
 <association property="Dean" javaType="cn.java.bean.Dean">
功能:定义一对一关系,如一个系对应一个系主任
 
3、MyBatis 框架的多对多联系的多表查询
 多对多联系(n:m):
观察 student 表和 course 表,两个表之间的关系是多对多联系,即每个学生可以选修多门课,每门课程可以由多位学生学习;
 第三方表: takes 表,该表存储学生选修某门课程的成绩数据;
 注意:多对多联系一定涉及到 3 个表;
 查询需求:查询每个学生选修的课程信息,及课程的分数。
请写出 SQL 查询语句。
在 Student 实体类中,添加一个 List<Course> courseList 属性:
private List<Course> courseList; //表示某个学生的选课情况
 为该属性生成相应的 get/set 方法;
 在 Course 实体类中,添加一个 List<Takes> takeList 属性:
private List<Takes> takesList;  //表示某门课程的分数情况
 为该属性生成相应的 get/set 方法;
编写 sql 映射文件 StudentMapper.xml
<!--定义结果集:学生的多个选课及每门课程的分数-->
<resultMap id="StudentCourseTakesMap" type="cn.java.pojo.Student">
<id property="id" column="ID"/>
<result property="name" column="name" />
<result property="deptName" column="dept_name" />
<result property="totCred" column="tot_cred" />
<!--选修多门课程-->
<collection property="courseList" ofType="cn.java.bean.Course">
<id property="courseId" column="course_id"/>
<result property="title" column="title"/>
<result property="deptName" column="dept_name"/>
<result property="credits" column="credits"/>
<!--每门课程有多个成绩-->
<collection property="takesList" ofType="cn.java.bean.Takes">
<id property="id" column="ID"/>
<id property="courseId" column="course_id"/>
<id property="secId" column="sec_id"/>
<id property="semester" column="semester"/>
<id property="year" column="year"/>
<result property="grade" column="grade"/>
</collection>
</collection>
</resultMap>
<select id="getStudGrade" resultMap="StudentCourseTakesMap">
SELECT *
FROM student,takes,course
WHERE student.`ID`=takes.`ID`
AND course.`course_id`=takes.`course_id`
</select>