一、延迟加载
resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
在mybatis核心配置文件中配置:
lazyLoadingEnabled、aggressiveLazyLoading
设置项 |
描述 |
允许值 |
默认值 |
lazyLoadingEnabled |
全局性设置懒加载。如果设为‘false',则所有相关联的都会被初始化加载。 |
true | false |
false |
aggressiveLazyLoading |
当设置为‘true'的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 |
true | false |
true |
场合:
当只有部分记录需要关联查询其它信息时,此时可按需延迟加载,需要关联查询时再向数据库发出sql,以提高数据库性能。
当全部需要关联查询信息时,此时不用延迟加载,直接将关联查询信息全部返回即可,可使用resultType或resultMap完成映射。
二:案例:(在部门和员工一对多)
源码介绍:
1.Dept.java
package cn.zhang.entity; import java.util.HashSet; import java.util.Set; public class Dept { private Integer deptno; private String deptname; private Setemp = new HashSet (); @Override public String toString() { return "Dept [deptno=" + deptno + ", deptname=" + deptname + ", emp=" + emp + "]"; } public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } public String getDeptname() { return deptname; } public void setDeptname(String deptname) { this.deptname = deptname; } public Set getEmp() { return emp; } public void setEmp(Set emp) { this.emp = emp; } }
2.Emp.java
package cn.zhang.entity; public class Emp { private Integer empno; private String empname; @Override public String toString() { return "Emp [empno=" + empno + ", empname=" + empname + "]"; } public Integer getEmpno() { return empno; } public void setEmpno(Integer empno) { this.empno = empno; } public String getEmpname() { return empname; } public void setEmpname(String empname) { this.empname = empname; } }
3.MybatisUtil.java
package cn.zhang.util; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * 工具类 * */ public class MybatisUtil { private static String cOnfig= "mybatis-config.xml"; static Reader reader; static { try { reader = Resources.getResourceAsReader(config); } catch (IOException e) { e.printStackTrace(); } } private static SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(reader); // 提供一个可以获取到session的方法 public static SqlSession getSession() throws IOException { SqlSession session = factory.openSession(); return session; } }
4.DeptDao.java
package cn.zhang.dao; import java.io.IOException; import cn.zhang.entity.Dept; public interface DeptDao { /** * 查询指定记录 * @return * @throws IOException */ public Dept findById(Integer id) throws IOException; }
5.DeptDAO.xml
<&#63;xml version="1.0" encoding="UTF-8" &#63;>
6.mybatis-config.xml (延迟加载的配置在此)
<&#63;xml version="1.0" encoding="UTF-8" &#63;>
7.MyTest.java(测试类)
package cn.zhang.test; //一对多 import java.io.IOException; import org.apache.ibatis.session.SqlSession; import org.junit.Before; import org.junit.Test; import cn.zhang.dao.DeptDao; import cn.zhang.entity.Dept; import cn.zhang.util.MybatisUtil; public class MyTest { DeptDao dao; @Before public void initData() throws IOException{ SqlSession session = MybatisUtil.getSession(); dao = session.getMapper(DeptDao.class); } /** * 查询指定记录 * @throws IOException */ @Test public void findAll() throws IOException{ Dept dept = dao.findById(1); System.out.println(dept); } }
测试结果:
在下面位置打断点
情况一:在mybatis-config.xml中不做配置情况
情况二:在mybatis-config.xml中配置
下一步:
F6下步:
F6下步:打出员工的名字
情况三:
F6下一步:
F6下一步:打印出员工名字
以上所述是小编给大家介绍的Mybatis中的延迟加载,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!