MyBatis-延迟加载与MyBatis缓存-概念性
MyBatis-延迟加载与MyBatis缓存
延迟加载(面试题)
1、什么是延迟加载(按需加载)
resultMap中的association(has a)和collection(has some)标签具有延迟加载的功能。
延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。需要关联信息时再去按需加载关联信息。这样会大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
- 设置延迟加载(配置问题使用代码演示)
Mybatis默认是没开启延迟加载功能的,我们需要手动开启。 - 需要在mybatis-config.xml文件中,在标签中开启延迟加载功能。
lazyLoadingEnabled、aggressiveLazyLoading
在最新官方MyBatis文档里,有上面这2个属性,一个是延迟加载,一个是分层加载。
lazyLoadingEnabled 默认值为false,那么在有级联关系的resultMap里,查询后会加载出所有的级联关系,当然有时候我们并不需要这些所有的时候,我们就可以应用到延迟加载给我们带来的好处了。
aggressiveLazyLoading默认值是true,这里我称之为分层加载,大概意思是如果它为true,那么当我使用了延迟加载,要么所有级联都不加载,
要么如果我加载一个,其他都得加载.
aggressiveLazyLoading值是false 那么就是按需加载,如果是true表示只要使用一个级联对象,就全部加载!
- 全部配置
- 局部配置
fetchType是可以注明在association 和 collection里的,选值为eager和lazy,就是为了方便我们结合aggressiveLazyLoading(false)
来配合使用的,让延迟加载发挥到极致,即只加载我需要的!
如果全局和局部同时生效,那么就近原则,局部生效!
2、延迟加载
以下是resultMap对应的POJO
- Student:
public class Student {
private Integer id;
private String studentName;
private String studentAge;
private List studentHealthCards;
private ParentOfStudent parentOfStudent;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentAge() {
return studentAge;
}
public void setStudentAge(String studentAge) {
this.studentAge = studentAge;
}
public List getStudentHealthCards() {
return studentHealthCards;
}
public void setStudentHealthCards(List studentHealthCards) {
this.studentHealthCards = studentHealthCards;
}
public ParentOfStudent getParentOfStudent() {
return parentOfStudent;
}
public void setParentOfStudent(ParentOfStudent parentOfStudent) {
this.parentOfStudent = parentOfStudent;
}
@Override
public String toString() {
return "Student [id=" + id + ", studentName=" + studentName + ", studentAge=" + studentAge + "]";
}
<