Mybatis(9) 一对多和多对一处理
9.多对一处理
9.1
多个学生,对应一个老师
对于学生而言 关联 多个学生,关联一个老师 【多对一】
对于老师而言 集合 一个老师,有很多学生【一对多】
Sql:
CREATE TABLE `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 `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');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');
环境搭建:

9.2 按照查询嵌套处理
<mapper namespace="com.luo.dao.StudentMapper">
<select id="getStudentAndTeacher" resultMap="StudentTeacher" >
select *from mybatis.student;
</select>
<resultMap id="StudentTeacher" type="student">
<!-- 复杂的属性,我们需要单独处理 对象 association 集合:collection-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"></association>
</resultMap>
<select id="getTeacher" resultType="teacher">
select *from mybatis.teacher where id=#{id}
</select>
</mapper>
9.3 按照结果嵌套处理
<select id="getStudentAndTeacher2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.name tname,t.id tid from mybatis.student s inner join mybatis.teacher t on s.tid=t.id
</select>
<resultMap id="StudentTeacher2" type="student">
<result property="id" column="sid"></result>
<result property="name" column="sname"></result>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"></result>
<result property="id" column="tid"></result>
</association>
</resultMap>
10.多对一处理
比如:一个老师拥有多个学生!
对于老师而言,就是一对多的关系。
实体类:
private int id;
private String name;
private List<Student> students;
private int id;
private String name;
private int tid;
//获取指定老师下所有学生及老师的信息
Teacher getTeacher(int id);
按照结果集查询
<mapper namespace="com.luo.dao.TeacherMapper">
<select id="getTeacher" resultMap="getTeachers">
SELECT s.id sid,s.name sname,t.name tname ,t.id tid FROM
mybatis.student s INNER JOIN
mybatis.teacher t ON s.tid=t.id and tid=#{id}
</select>
<resultMap id="getTeachers" type="Teacher">
<result property="id" column="tid"></result>
<result property="name" column="tname"></result>
<collection property="students" ofType="Student">
<result property="id" column="sid"></result>
<result property="name" column="sname"></result>
<result property="id" column="tid"></result>
</collection>
</resultMap>
</mapper>
小结:
l 1.关联: association [多对一]
l 2.集合 collection [一对多]
l javaType & ofType
n 1.javaType 用来指定实体类中属性的类型
n 2.ofType 用来指定映射到List或者集合中pojo类型,泛型中的约束类型
注意点:
l 保证sql的可读性,尽量保证通俗易懂
l 注意一对多和多对一中,属性名和字段的问题

浙公网安备 33010602011771号