深入浅出Mybatis系列(十)---延迟加载
一、延迟加载
resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
在mybatis核心配置文件中配置:
|
设置项 |
描述 |
允许值 |
默认值 |
|
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 mapper
PUBLIC "-//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 configuration
PUBLIC "-//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系列(十)---延迟加载的更多相关文章
- 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)
注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...
- 深入浅出Mybatis系列(九)---强大的动态SQL
上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.resultMap>简单介绍了mybatis的查询,至此,CRUD都已讲完.本文将介绍mybatis ...
- 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap
上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...
- 深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete
上篇文章<深入浅出Mybatis系列(六)---objectFactory.plugins.mappers简介与配置>简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介 ...
- 深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置
上篇文章<深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)>简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习 ...
- 深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)>为大家介绍了mybatis中别名的使用,以及其源码.本篇将为大家介绍TypeH ...
- 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...
- 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根 ...
- 深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(一)---Mybatis入门>, 写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们 ...
- 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good
上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...
随机推荐
- W: GPG 错误:http://mirrors.aliyun.com xenial/mongodb-org/3.2 Release: 由于没有公钥,无法验证下列签名: NO_PUBKEY D68FA50FEA312927
更新错误: 正在读取软件包列表... 完成 W: GPG 错误:http://mirrors.aliyun.com xenial/mongodb-org/3.2 Release: 由于没有公钥,无法验 ...
- Spring RestTemplate 之exchange方法
●exchange方法提供统一的方法模板进行四种请求:POST,PUT,DELETE,GET (1)POST请求 String reqJsonStr = "{\"code\&quo ...
- 【模拟】选数 luogu-1037
AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) memset(a,b,sizeof(a)) typed ...
- python使用正则+jsonpath处理接口依赖
1.接口2的入参值依赖接口1的响应结果,如接口2的入参ids需要拿到接口1响应结果的id字段值,测试用例写在excel中,参数:{"ids":"${$..id}$&quo ...
- Python实用案例,Python脚本,Python实现帮你选择双色球号码
往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 前言: 今天我们就利用python脚本实现帮你选择双色球号码.直接开整~ 开发工具: python版本: 3 ...
- 《Android原生整合虹软SDK开发uniapp插件》
1.项目背景 应公司要求,需要开发一套类似人脸打卡功能的app,但是因为我们公司没有很强的原生android开发者,所以根据现状选择了第三方跨平台的uniapp,想必目前大多人都了解这个平台了,我也就 ...
- React Hooks的理解
一.是什么 Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 至于为什么引入hook,官方给出的动机是解决长时间使 ...
- VS2019 +MySQL+EntityFramework 使用配置与坑点避免随记
一.安装运行环境 首先我们到mysql的官方网站上下载 mysql-installer-community-8.0.26.0 ,或者其他特定版本,通过它我们可以先将 mysql-for-visuals ...
- 杭电OJ 输入输出练习汇总
主题 Calculate a + b 杭电OJ-1000 Input Each line will contain two integers A and B. Process to end of fi ...
- API接口测试
一.测试工具 二.测试方法 二.测试需要注意的点