文章目录
- 一、实现多表联查(association 标签)
- 1、实现多对一关系结果集映射
- 二、实现多表联查(collection 标签)
一、实现多表联查(association 标签)
-
association 标签: 实现一对一,多对一的关联关系
-
association 标签属性
-
property :实体类属性名
-
javaType :指定关联的类型,当使用select属性时,无需指定关联的类型
-
select :使用另一个select查询封装的结果。当使用该属性时,无需配置实体类与数据库之间的映射关系
-
column :为数据库中的列名,与select配合使用(注:如果SQL中使用字段别名,那么此属性便记录字段别名)
-
-
1、实现多对一关系结果集映射
-
多对一:
-
多个学生,对应一个老师
-
对于学生而言,关联–多个学生,关联一个老师【多对一】
-
对于老师而言,集合–一个老师,有很多个学生【一对多】
-
-
SQL
-- 创建教师表
CREATE TABLE IF NOT EXISTS `teacher` (
`id` int(10) NOT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--新增一名教师
INSERT INTO `teacher` (`id`, `name`) VALUES (1, '柳神');
-----------------------------------------------------------------
--创建学生表
CREATE TABLE IF NOT EXISTS `student` (
`id` int(10) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`tid` int(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--新增学生
INSERT INTO `student` (`id`, `name`, `tid`) VALUES(1, '楚风', 1),(2, '龙大宇', 1),(3, '姬大德', 1),(4, '石昊', 1),(5, '叶凡', 1);
实现多对一查询的方式有两种,一种是按照查询嵌套处理,一种是按照结果嵌套处理。
- 按照查询嵌套处理,(但是需要两个sql 才能实现,看着有点怪异,不推荐使用)
<select id="getStudent" resultMap="StudentMap">
select * from student
</select>
<resultMap id="StudentMap" type="Student">
<result column="id" property="id"/>
<result column="name" property="name"/>
<!-- 通过 select 调用查询教师的 SQL,将结果集存储到JavaBaen中,类似于子查询 -->
<association property="teacher" column="tid" javaType="Student" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher
</select>
- 按照结果嵌套处理(推荐使用)
<resultMap id="StudentAndTeacher" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<!-- 将查询结果映射到 Teacher 实体类中 -->
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
<select id="getStudentAndTeacher" parameterType="Student" resultMap="StudentAndTeacher">
select s.id sid, s.name sname, t.name tname
from student s,
teacher t
where s.tid = t.id
</select>
运行结果:
二、实现多表联查(collection 标签)
-
collection 标签: 实现一对多,多对多的关联关系
-
collection 标签属性
-
property :实体类属性名
-
select :使用另一个select查询封装的结果。当使用该属性时,便不需要在配置实体类与数据库之间的映射关系了
-
column :为数据库中的列名,与select配合使用(注:如果SQL中使用字段别名,那么此属性便记录字段别名)
-
ofType :指定集合中元素的对象类型
-
-