时间:2021-05-20
一、延迟加载
resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
在mybatis核心配置文件中配置:
lazyLoadingEnabled、aggressiveLazyLoading
设置项
描述
允许值
默认值
lazyLoadingEnabled
全局性设置懒加载。如果设为‘false',则所有相关联的都会被初始化加载。
true | false
false
aggressiveLazyLoading
当设置为‘true'的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。
true | false
true
<settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/></settings>场合:
当只有部分记录需要关联查询其它信息时,此时可按需延迟加载,需要关联查询时再向数据库发出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 Set<Emp> emp = new HashSet<Emp>(); @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<Emp> getEmp() { return emp; } public void setEmp(Set<Emp> 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
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.zhang.dao.DeptDao"> <!-- 3.根据员工id查询员工信息 --> <select id="selectEmpByDeptNo" resultType="Emp"> select empno,empname from emp where deptno=#{deptno} </select> <!-- 2.对部门实体的映射 --> <resultMap type="Dept" id="deptMapper"> <id property="deptno" column="deptno" /> <result property="deptname" column="deptname" /> <!-- 一对多部门关联的员工 --> <!--select:关联员工查询 --> <!--column:关联员工查询所需要的条件(来源于1) --> <collection property="emp" ofType="Emp" select="selectEmpByDeptNo" column="deptno" /> </resultMap> <!--1.根据部门id查询部门信息 --> <select id="findById" resultMap="deptMapper"> select deptno,deptname from dept where deptno=#{deptno} </select></mapper>6.mybatis-config.xml (延迟加载的配置在此)
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!--lazyLoadingEnabled:设置懒加载,默认为false。如果为false:则所有相关联的都会被初始化加载。 aggressiveLazyLoading:默认为true。当设置为true时,懒加载的对象可能被任何懒属性全部加载;否则,每个属性按需加载。 --> <settings> <!-- 打开延迟加载的开关 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 将积极加载改为消息加载即按需加载 --> <setting name="aggressiveLazyLoading" value="false" /> </settings> <!-- 配置别名 --> <typeAliases> <!--方式一: 按类型名定制别名 --> <!--方式二: 拿当前指定包下的简单类名作为别名 --> <package name="cn.zhang.entity" /> </typeAliases> <environments default="oracle"> <environment id="oracle"> <!-- 使用jdbc的事务 --> <transactionManager type="JDBC" /> <!-- 使用自带的连接池 --> <dataSource type="POOLED"> <!-- 我用的Oracle数据库 --> <property name="driver" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /> <property name="username" value="study" /> <property name="password" value="123" /> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/zhang/dao/DeptDAO.xml" /> </mappers></configuration>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中配置
<settings> <!-- 打开延迟加载的开关 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 将积极加载改为消息加载即按需加载 --> <setting name="aggressiveLazyLoading" value="false" /></settings>下一步:
F6下步:
F6下步:打出员工的名字
情况三:
F6下一步:
F6下一步:打印出员工名字
以上所述是小编给大家介绍的Mybatis中的延迟加载,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、Mybatis中的延迟加载1、延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association、coll
1、概念:MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询。例如在进行一对多查询的时候,只查
本篇文章主要介绍了懒加载和预加载两种技术的解析,废话不多说,一起来看吧。懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载延迟加载图片或符合某些条件时才加载
延迟加载也称为惰性加载,即在长网页中延迟加载图像。用户滚动到它们之前,视口外的图像不会加载。这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快。在某些情
js的延迟加载有助与提高页面的加载速度,以下是延迟加载的几种方法:1.使用setTimeout延迟方法的加载时间延迟加载js代码,给网页加载留出更多时间func