MyBatis 框架的多表查询的实现
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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下