Mybatis完整版(三)
十、多对一处理测试环境搭建按查询嵌套处理按结果嵌套处理
十一、一对多处理环境搭建,和上一个一样按照结果嵌套处理按照查询嵌套处理
小结
十、多对一处理
多对一:
多个学生,对应一个老师对于学生这边,关联…多个学生,关联一个老师【多对一】对于老师而言,集合,一个老师,有很多学生【一对多】
数据库设计
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');
测试环境搭建
导入lombok
<dependencies>
<dependency>
<groupId>org.projectlombok
</groupId>
<artifactId>lombok
</artifactId>
<version>1.18.12
</version>
</dependency>
</dependencies>
新建实体类(增加注解@Data)
@Data
public class Teacher {
private int id
;
private String name
;
}
@Data
public class Student {
private int id
;
private String name
;
private Teacher teacher
;
}
编写实体类对应的Mapper接口
无论有没有需求,都应该写上,以备后来之需!
public interface StudentMapper {
}
public interface TeacherMapper {
}
编写Mapper接口对应的Mapper.xml文件
无论有没有需求,都应该写上,以备后来之需!
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.roc.dao.StudentMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.roc.dao.TeacherMapper">
</mapper>
在核心配置文件中绑定注册我们的Mapper接口或者文件!【方式很多,随心选】
<mappers>
<mapper class="com.roc.dao.TeacherMapper"/>
<mapper class="com.roc.dao.StudentMapper"/>
</mappers>
测试查询是否能成功!
按查询嵌套处理
<mapper namespace="com.roc.dao.StudentMapper">
<select id="getStudents" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="com.roc.pojo.Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<association property="teacher" column="tid" javaType="com.roc.pojo.Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="com.roc.pojo.Teacher">
select * from teacher where id = #{id}
</select>
</mapper>
按结果嵌套处理
<select id="getStudents2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.id tid,t.name tname
from student s,teacher t
where s.tid = t.id
</select>
<resultMap id="StudentTeacher2" type="com.roc.pojo.Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="com.roc.pojo.Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>
回顾MySQL多对一查询方式:
子查询链表查询
十一、一对多处理
一个老师拥有多个学生对于老师而言,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)!
环境搭建,和上一个一样
实体类
@Data
public class Student {
private int id
;
private String name
;
private int tid
;
}
@Data
public class Teacher {
private int id
;
private String name
;
private List
<Student> students
;
}
按照结果嵌套处理
<select id="getTeacher" resultMap="TeacherStudent">
select s.id sid,s.name sname,t.name tname,t.id tid
from student s,teacher t
where s.tid = t.id and t.id = #{tid}
</select>
<resultMap id="TeacherStudent" type="com.roc.pojo.Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="students" ofType="com.roc.pojo.Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
按照查询嵌套处理
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from teacher where id = #{tid}
</select>
<resultMap id="TeacherStudent2" type="com.roc.pojo.Teacher">
<collection property="students" javaType="ArrayList" ofType="com.roc.pojo.Student" select="getStudentByTeacherId" column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="com.roc.pojo.Student">
select * from student where tid = #{id}
</select>
小结
1、关联-association
2、集合-collection
3、所以association是用于一对一和多对一,而collection是用于一对多的关系
4、JavaType和ofType都是用来指定对象类型的
JavaType是用来指定pojo中属性的类型
ofType指定的是映射到list集合属性中pojo的类型。
注意说明:
1、保证SQL的可读性,尽量通俗易懂
2、根据实际要求,尽量编写性能更高的SQL语句
3、注意属性名和字段不一致的问题
4、注意一对多和多对一 中:字段和属性对应的问题
5、尽量使用Log4j,通过日志来查看自己的错误