前 言 : textcolor{blue}{前言:} 前言:
gitee中MyBatis学习源码所用到的代码都可以在这里找到
点一下送你到Gitee
- 十、多对一处理
- 1. 基本环境搭建
- 1.1 创建数据库表
- 1.2 导入Lombok
- 1.3 新建实体类Teacher,Student
- 1.4 建立Mapper接口
- 1.5建立Mapper.xml文件
- 1.6 在核心配置文件中绑定注册我们的Mapper接口或者文件
- 1.7 测试查询是否能够成功
- 2. 按照查询嵌套处理
- 3. 按照查询嵌套处理
- 十一、一对多处理
- 1. 环境搭建
- 2. 按照结果嵌套处理
- 3. 按照查询嵌套处理
- 小结
- 面试高频
-
多个学生对应一个老师
-
对于学生这边:关联,多个学生关联一个老师【多对一】
-
对于老师这边:集合,一个老师又很多学生【一对多】
#数据库里面的`teacher`是键盘Tab上面的,而'王老师'这里的'是回车左边的 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);1.2 导入Lombok
1.3 新建实体类Teacher,Studentorg.projectlombok lombok 1.18.20
@Data
public class Teacher {
private int id;
private String name;
}
@Data
public class Student {
private int id;
private String name;
//学生需要关联一个老师
private Teacher teacher;
}
1.4 建立Mapper接口
import com.hxl.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface TeacherMapper {
@Select("select * from teacher where id = #{tid}")
Teacher getTeacher(@Param("tid")int id);
}
public interface StudentMapper {
}
1.5建立Mapper.xml文件
这个地方创建mapper.xml文件时,需要注意创建的包一定可以展开否则会报错。
查看可以展开包的方式可以阅读这篇文章。
1.6 在核心配置文件中绑定注册我们的Mapper接口或者文件
这里如果使用class就必须让TeacherMapper和TeacherMapper.xml在同一个文件下。
1.7 测试查询是否能够成功
public class myTest {
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher(1);
System.out.println(teacher);
sqlSession.close();
}
}
2. 按照查询嵌套处理
复杂的属性,我们需要单独处理. 对象:association 集合:collection
javaType=""指定属性的类型! 集合中的泛型信息,我们使用ofType获取
public interface StudentMapper {
//查询所有的学生信息,以及对应的老师的信息
public List getStudent();
}
3. 按照查询嵌套处理
select s.id sid, s.name sname, t.name tname from student s, teacher t where s.tid = t.id;
-
回顾Mysql多对一查询方式
- 子查询
- 联表查询
比如:一个老师拥有多个学生
对于老师而言,就是一对多的关系。
1. 环境搭建和之前的一样,将之前的copy过来,然后把实体类进行修改
@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 students;
}
接口中进行方法编写
public interface TeacherMapper {
//获取所有老师
//List getTeacher();
//获取指定老师下的所有学生及老师的信息
Teacher getTeacher(@Param("tid") int id);
Teacher getTeacher2(@Param("tid") int id);
}
2. 按照结果嵌套处理
3. 按照查询嵌套处理select s.id sid, s.name sname,t.name tname,t.id tid from student s,teacher t where t.id = s.tid and t.id = #{tid};
小结select * from teacher where id = #{tid} select * from student where tid = #{tid}
- 关联-association【多对一】
- 集合-collection【一对多】
- javaType & ofType
- javaType用来指定实体类中属性的类型
- ofType用来指定映射到List或者集合张的pojo类型,泛型中的约束类型
注意点:
- 保证sql的可读性,尽量保证通俗易懂
- 注意一对多和多对一中,属性名和字段的问题
- 如果问题不好排查错误,可以使用日志,建议使用Log4j
结果映射:结果映射
面试高频M y S Q L 引 擎 ; I n n o D B 底 层 原 理 ; 索 引 ; 索 引 优 化 。 textcolor{red}{ MySQL引擎; InnoDB底层原理; 索引; 索引优化。 } MySQL引擎;InnoDB底层原理;索引;索引优化。



